题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解
题
思
路
:
\color{blue}解题思路:
解题思路:
这道题最容易想到的思路是暴搜,时间复杂度为n * m
,但是这样显然没有利用从左到右递增、从上到下递增的排列顺序
,体现不出算法的高效性。
这道题的关键切入点在右上角
。假设起始搜索坐标为[0, colSize - 1]
,row = 0
,col = colSize - 1
。
如果array[row, col] < target
,由于每一行从左到右递增
的排列顺序,则target
不可能出现在第row
行,因为每一行的左端是较大的值,array[row, col]
较大值都小于target
,那它左边的较小的值更不可能了。所以row += 1
如果array[row, col] > target
,由于每列从上到下递增
的排列顺序,则target
不可能出现在第col
列下、右边,因为每一列的下端、每行的右端是较大的值,array[row, col]
较小值都大于target
,其它较大的值更不可能了。
否则array[row, col] == target
,皆大欢喜,搜索到了。
还有一种可能就是调整row
、col
出现了越界,说明二维数组中不存在target
这个数。
代 码 实 现 : \color{blue}代码实现: 代码实现:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rowSize = array.size();
//注意行数是array.size(),列数是array[0].size()
int row = 0, col = array[0].size() - 1;
while (row < rowSize && col > -1) {
if (array[row][col] < target) {
//小了,排列顺序从上->下递增,所以row增大
row += 1;
} else if (array[row][col] > target) {
//大了,排列顺序从左->右递增,所以col减小
col -= 1;
} else {
return true;
}
}
return false;
}
};
题
目
推
荐
:
\color{blue}题目推荐:
题目推荐: