0
点赞
收藏
分享

微信扫一扫

[算法]剑指offer p3 二维数组中的查找 golang

M4Y 2022-02-11 阅读 46

题目

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路

实例1

使用实例举例子比如下面的矩阵中查找 1

1 2 3 4
2 3 4 5
3 4 5 6
6 7 8 9

如果我们从右上角的 4 开始比较

(1) 1 < 4 排除一列

1 2 3
2 3 4 
3 4 5 
6 7 8 

(2) 1 < 3 排除一列

1 2 
2 3 
3 4 
6 7 

(3) 1 < 2 排除一列

1 
2 
3 
6 

(4) 1 == 1 命中, 返回 true

实例2

使用实例举例子比如下面的矩阵中查找 7

1 2 3 4
2 3 4 5
3 4 5 6
6 7 8 9

如果我们从右上角的 4 开始比较

(1) 7 > 4 排除一行

2 3 4 5
3 4 5 6
6 7 8 9

(2) 7 > 5 排除一行

3 4 5 6
6 7 8 9

(3) 7 > 6 排除一行

6 7 8 9

(4) 7<9 排除一列

6 7 8 

(5) 7<8 排除一列

6 7 

(6) 7 == 7 命中

golang 代码

//判断整数在有序的二维数组(左到右,上到下递增)中是否存在
func Exists(matrix [][]int, target int) (exists bool) {
	//参数处理
	if len(matrix) == 0 {
		return
	}
	//todo: 保证每个 row 的元素都是一致的, 保证这是一个矩形
	//右上角的坐标
	x := 0
	y := len(matrix[0]) - 1
	for {
		//溢出旧退出没有命中
		if y == -1 || x == len(matrix) {
			return
		}
		//命中
		if matrix[x][y] == target {
			return true
		}
		//小于 target 减少行 ,
		if matrix[x][y] < target {
			x++
			continue
		}
		//大于 target 减少列
		if matrix[x][y] > target {
			y--
			continue
		}
	}
}

测试用例1

package main

import (
	"testing"

	"github.com/stretchr/testify/assert"
)
func TestP3(t *testing.T) {
	testDatas := []struct {
		marix  [][]int
		target int
		except bool
	}{
		{
			marix: [][]int{
				{1, 2, 3, 4},
				{2, 3, 4, 5},
				{3, 4, 5, 6},
				{6, 7, 8, 9},
			},
			target: 7,
			except: true,
		},
	}
	for _, testData := range testDatas {
		assert.Equal(t, testData.except, Exists(testData.marix, testData.target))
	}
}
举报

相关推荐

0 条评论