题目:在一个二维数组中,每一行都从左向右递增,每一列都从上到下递增。给定一个数target,判断这个数是否出现在二维数组中。
解题思路
如果使用暴力搜索整个数组的话时间复杂度是O(n^2),比较不理想,那么有没有更快地方法呢?观察如下数组
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
我们可以发现,在数组中有两个特殊的点,就是矩阵的右上角和矩阵的左下角。这两个点都有一个特性,如果目标值大于或小于点的值时,就可以排除一整列或者一整行,那么最多只需要执行2n次排除操作,时间复杂度是O(n)。那么我们以右上角为例实现代码:
bool Find(int target, vector<vector<int> > array) {
if (array.empty()) return false;
int i = 0, j = array[0].size()-1;
while(i<array.size() && j<array[0].size()){
if (array[i][j]==target)
return true;
else if (array[i][j]<target)
i++;
else
j--;
}
return false;
}