原题
题解
方法一
暴力法
/*暴力
*@v7fgg
*执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
*内存消耗:39.9 MB, 在所有 Java 提交中击败了94.29%的用户
*2020年6月20日 17:54
*/
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(matrix[i][j]==target){
return true;
}
}
}
return false;
}
}
方法二
完全二分
/*
*@v7fgg
*执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
*内存消耗:39.4 MB, 在所有 Java 提交中击败了94.29%的用户
*2020年6月20日 17:59
*/
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length>0&&matrix[0].length>0){
int m=0;
int n=matrix[0].length-1;
while(m<matrix.length&&n>=0){
if(matrix[m][n]>target){n--;}
else if(matrix[m][n]<target){m++;}
else{return true;}
}
}
return false;
}
}
部分二分
/*二分
*@v7fgg
*执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
*内存消耗:40 MB, 在所有 Java 提交中击败了94.29%的用户
*2020年6月20日 18:00
*/
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length>0&&matrix[0].length>0){
for(int i=0;i<matrix.length;i++){
//如果搜到某行第一个数都比target大,那么接下来就都不可能存在了
if(matrix[i][0]>target){break;}
//某行最大的数比target小,需要继续搜索下一行
if(matrix[i][matrix[0].length-1]<target){continue;}
if(erfen(matrix[i],target)){return true;}
}
}
return false;
}
public boolean erfen(int a[],int target){
//二分法判断某升序数组是否含有target
int left=0;
int right=a.length-1;
while(left<=right){
//注意是left<=right
int mid=(left+right)/2;
if(a[mid]>target){right=mid-1;}
else if(a[mid]<target){left=mid+1;}
//增加这个判断if(left==right)
else if(left==right){return a[mid]==target;}
else{return true;}
}
return false;
}
}
方法三
行列移动法
/*
*@v7fgg
*执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
*内存消耗:39.5 MB, 在所有 Java 提交中击败了94.29%的用户
*2020年6月20日 18:08
*/
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length>0&&matrix[0].length>0){
int left=0;
int m=matrix.length;
int n=matrix[0].length;
int right=m*n-1;
while(left<=right){
int mid=(left+right)/2;
int a=matrix[mid/n][mid%n];
if(a>target){right=mid-1;}
else if(a<target){left=mid+1;}
else if(left==right){return a==target;}
else{return true;}
}
}
return false;
}
}