**题目描述**
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
**解题思路**
刚拿到这道题,最简单的办法是二维数组全都遍历一遍,时间复杂度O(m*n)。但是好像排序的性质就浪费了哈。
进一步想一下,每一行都是排序的,是不是可以每行都用二分查找呢,当然可以,时间复杂度简化为O(mlogn).但是只用了行的排序,列的排序好像没用,因为列和行都是排序的。
我们这时候考虑左下角或者右上角的元素。我以左下角元素为例,该元素一定是他所在列的最大元素,是他所在行的最小元素。有了这个性质是不是好多了,那我们就让该元素跟target比较:
(1) 如果他比target小,那么他所在列的所有元素都比他小,我们可以去掉这一列。
(2) 如果他比target大,那么他所在行的所有元素都比他大,我们可以去掉这一行。所以每次值的比较,行-1或者列+1就可以了。话不多说,上C++代码!
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int i = array.size()-1, j = 0;
while(j<array[0].size() && i>=0){
if(array[i][j] == target) return true;
else if(array[i][j] < target) j++;
else i--;
}
return false;
}
};