剑指offer(一):二维数组中的查找
题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
分析:
二维数组的定义:
最直观的解题思路是找到一个数和target对比,如果大或者小,接下来怎么办。
但是,找到比较的数,这个数的选择是关键的。因为比较完只能有三个结果:相等则return,大的话往小的方向走,再继续比较。小的话往大的方向走,再继续比较。经过模拟,可以知道这个比较的数需要选在左上角或者右下角。
以下这个图来自https://cuijiahua.com/blog/2017/11/basis_1.html。
代码中找的点是右上角。
代码:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rowNum = array.size();
int culNum = array[0].size();
if(!array.empty()&&rowNum>0&&culNum>0){
int i=rowNum-1;
int j=0;
while(i>=0&&j<culNum){
int cur=array[i][j];
if(cur==target)
return true;
else if(cur<target){
j++;
}
else
i--;
}
}
return false;
}
};