在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路
以搜索5为例,观察可知,7的右边(包括7)所有列里面的数字都大于5,而10的下边(包括10)所有行的数字都大于5。因此将搜索范围从矩阵收缩到6个数字。搜索时建议从右下到左上进行搜索。即找到红色框后,进行搜索。
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0||matrix[0].empty())
return false;
int y=matrix.size();
int x=matrix[0].size();
for(int i=0;i<matrix.size();i++){
if(matrix[i][0]>target)
y=i; //寻找列边界
}
for(int i=0;i<matrix[0].size();i++){
if(matrix[0][i]>target)
x=i; //寻找行边界
}
for(int i=y-1;i>=0;i--){
for(int j=x-1;j>=0;j--){
if(matrix[i][j]==target)
return true;
}
}
return false;
}
};