原题链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/
不利用特性的话,遍历二维数组查找,时间复杂度为O(m*n);
利用特性1,每行都进行一次折半查找,那么我们的时间复杂度为O(m*logn);
那如果加上特性2呢?问题是如何利用特性2。
- matrix[0][0]也就是1,右边比它大,下边比它也大;
- matrix[0][4]也就是15,左边比它小,下边比它大;
- matrix[4][0]也就是18,上边比它小,右边比它大;
- matrix[4][4]也就是30,上边比它小,左边也比他小;
也就是说,(0,4)或者(4,0)都可以根据一大一小的关系进行移动。
比方从18开始,target=5
- 5比18小,则上移到10
- 5比10小,则上移到3
- 5比3大,则右移到6
- 5比6小,则上移到5
- 最终找到target
这样子的话,我们的时间复杂度最大也就是O(m+n)
看懂了吧~ 直接上代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix==null||matrix.length==0||matrix[0].length==0){
return false;
}
int row=matrix.length;
int col=matrix[0].length;
int x=row-1;
int y=0;
while(true){
if(x<0||y>=col){
return false;
}
if(matrix[x][y]<target){
y++;
}else if(matrix[x][y]>target){
x--;
}else{
return true;
}
}
}
}