思路:
通过使用二分方式,对于每行进行二分,因为每行的最后一个数小于下一行的第一个数,我们就可以依次二分。首先取出行数N,然后从0-N进行二分,如果mid最后一个数小于目标值说明0-mid中没有,舍弃,从mid+1到N-1行进行寻找。然后在进行二分直到找到或者便利完为止。代码如下:
java
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix==null||matrix.length==0||matrix[0].length==0){
return false;
}
int N=matrix.length;
int M=matrix[0].length;
//每一行都是递增序列
//每一行第一个数都是大于前一行最后一个数===>每一列都是递增 每一列的数都是大于前一行任意数
return process(matrix,M,0,N-1,target);
}
private boolean process(int[][] matrix, int M, int L, int R, int target) {
if (matrix[L][0]>target||matrix[R][M-1]<target){
return false;
}
if (L==R){
int[] nums = matrix[L];
for (int i = 0; i < nums.length; i++) {
if (nums[i]==target){
return true;
}
}
return false;
}
int mid=L+(R-L)/2;
if (matrix[L][0]<=target&&matrix[L+(R-L)/2][M-1]>=target){
return process(matrix,M,L,mid,target);
}else{
return process(matrix,M,mid+1,R,target);
}
}
}