题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3b24a26e60053a84c0bb0b62f7b50032.png)
思路
- 看了一下数据量有10^9这么多,那必定二分查找了。这道题第一眼看很简单,再一看好像也没有那么简单。
- 不然还是从左往右开始找,没找到就从上往下开始找,找不到的话直接返回即可。虽然用了四个二分查找,但是最后还是没做出来,有个特殊用例直接把我的思路否定了- -润去题解
- 好像是对每一行进行二分查找即可,行吧我想复杂了。
错误代码(四个二分查找)
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix[0].length==1 && matrix.length==1){
if(matrix[0][0]==target) return true;
else return false;
}
if(matrix[matrix.length-1][matrix[0].length-1]==target) return true;
int left=0,right = matrix[0].length-1;
while(right-left>1){
int middle = left+(right-left)/2;
if(matrix[0][middle]<target) left=middle;
else if(matrix[0][middle]>target) right=middle;
else return true;
}
int up = 0,down = matrix.length-1;
if(matrix[up][0]==target || matrix[down][0]==target ) return true;
while(down-up>1){
int middle = up+(down-up)/2;
if(matrix[middle][left]<target) up=middle;
else if(matrix[middle][left]>target) down=middle;
else return true;
}
up = 0;
down = matrix.length-1;
while(down-up>1){
int middle = up+(down-up)/2;
if(matrix[middle][0]<target) up=middle;
else if(matrix[middle][0]>target) down=middle;
else return true;
}
left=0;
right=matrix[0].length-1;
if(matrix[0][left]==target || matrix[0][right]==target || matrix[up][left]==target || matrix[up][right]==target) return true;
while(right-left>1){
int middle = left+(right-left)/2;
if(matrix[up][middle]<target) left=middle;
else if(matrix[up][middle]>target) right=middle;
else return true;
}
return false;
}
正确代码
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix[0].length==1 && matrix.length==1){
if(matrix[0][0]==target) return true;
else return false;
}
for(int i=0;i<matrix.length;i++){
int left=0,right = matrix[0].length-1;
if(matrix[i][left]==target || matrix[i][right]==target) return true;
while(right-left>1){
int middle = left+(right-left)/2;
if(matrix[i][middle]<target) left=middle;
else if(matrix[i][middle]>target) right=middle;
else return true;
}
}
return false;
}