> 文章列表 > 剑指 Offer 04. 二维数组中的查找

剑指 Offer 04. 二维数组中的查找

剑指 Offer 04. 二维数组中的查找

剑指 Offer 04. 二维数组中的查找 - 力扣(Leetcode)

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

例子:

[[1,  4,  7, 11, 15],[2,  5,  8, 12, 19],[3,  6,  9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]
]
//给定 target = 5,返回 true。
//给定 target = 20,返回 false。

每一行都按照从左到右 非递减 的顺序排序也就是顺序排序却不是递减,那么就是递增

每一列都按照从上到下 非递减 的顺序排序也就是顺序排序却不是递减,那么就是递增观察代码,我们会发现每个元素的下右都是大于他的,而上左都是小于他的

 那么我们开辟思路我们从整个二维数组四边形的

 寻找方式为对角线查找流。

这里的开始方向必须是右上到左下。因为如果是左上或者右下开始,数据的两边都是大于或小于原来的值就没办法查找了

 但是如果是左下或者右上开始,就可以与target比较大小后移动了

这里我们来执行查找流程(右上开始)target==5

15比5大向左一位查找

 11比5大向左一位查找

7比5大向左一位查找

4比5小向下一位查找

 找到了!!返回ture

现在target为20开始查找,

15比20小,向下一位查找

19比20小,向下一位查找

 22比20大,向左一位查找

16比20小,向下一位查找

17比20小,向下一位查找

  26比20大,向左一位查找

 向左一直比20大,直到18

 18比20小向下超出范围,退出查找,返回false

 这就是我们的查找原理,看源代码。

bool findNumberIn2DArray(int** matrix, int matrixSize, int* matrixColSize, int target)
{if(matrixSize==0||(*matrixColSize)==0){return false;}int col = *matrixColSize - 1;int row=0;while(row<matrixSize&&col>=0){if(matrix[row][col]>target){col--;}else if(matrix[row][col]<target){row++;}else{return true;}}return false;
}