Description
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
Solution:
从右上角(或左下角)开始与target比较。如果大,那么同一列下面的所有元素都会比target大,均可排除;如果小,那么同一行左边的所有元素都会比target小,均可排除。所以如果target存在,这个方法不会漏掉他。
于是我们只需分成三种情况即可:
- 相等: return true
- 大于target:向左移动一格
- 小于target:向右移动一格
终止:因为每次循环必将向下或左移动一格,所以这个算法一定在O(M+N)时间内终止。
//C++
//Time: O(n+m), m,n为matrix的dimension
//Space: O(1)
bool Find(int target, const vector<vector<int> >& array) {
int i = array[0].size() - 1, j = 0;
while(i >= 0 && j < array.size()){
if(array[j][i] == target) return true;
array[j][i] < target ? ++j: --i;
}
return false;
}