原题链接:
力扣https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/description/
这题其实隐含了二分法的思想,按行看,从上到下递增,按列看,从左到右递增。
我们关注最左边一列,从上到下递增,左下角的数是最大的;再从这个数往右看,这个数是这一行最小的。所以其实左下角的这个数就是“二分法”中的中间位置“mid”。
我们可以用i表示行坐标,j表示列坐标,从左下角的数开始查找,若当前数大于目标值target,就需要找更小的数,也就是行数缩小,i--;若小于目标值target,就需要找更大的数,也就是列数增加,j++;若相等就找到了,返回true。若遍历完整个二维数组也没找到就是没有返回false。
具体代码和注释:
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int i=matrix.size()-1,j=0;//从左下角开始查找
while(i>=0&&j<matrix[0].size()){//注意边界值
if(matrix[i][j]<target){j++;}
else if(matrix[i][j]>target){i--;}
else{return true;}
}
return false;
}
};