【剑指Offer-数组】面试题4:二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路1
从右上角或者左下角一步一步缩小比较范围。假如从右上角开始,设当前数字(右上角)为cur,要查找的数字为target。如果cur==target,则查找成功;如果cur>target,因为数组中的元素从上到下递增排序,所以当前元素cur所在的这一列就不用比较了(该列元素>=cur>target),将当前元素cur所在列删除;如果cur<target,因为数组元素从左到右递增,则当前元素cur所在的这一行就不用比较了(该行元素<=cur<target),将将当前元素cur所在行删除。更新当前元素cur为查找范围修改后右上角的元素,重复前面的过程,直至查找范围为空。
代码如下:
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.empty() || matrix[0].empty()) return false;
int rows = matrix.size();
int cols = matrix[0].size();
int r = 0;
int c = cols-1;
while(r<rows && c>=0){
if(matrix[r][c]==target) return true;
else if(matrix[r][c]>target){
c--;
}else if(matrix[r][c]<target){
r++;
}
}
return false;
}
};
思路2
思路 1 是根据当前的位置是否超过的数组的范围来进行循环的,还可以通过是否找到 target 来进行循环。代码如下:
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.empty() || matrix[0].empty()) return false;
int rows = matrix.size();
int cols = matrix[0].size();
int r = 0;
int c = cols-1;
while(true){ // 这里使用 while(true)
if(matrix[r][c]==target) return true;
else if(matrix[r][c]>target){
c--;
if(c<0) return false;
}
else if(matrix[r][c]<target){
r++;
if(r>=rows) return false;
}
}
return false;
}
};