思路:
通过使用二分方式,对于每行进行二分,因为每行的最后一个数小于下一行的第一个数,我们就可以依次二分。首先取出行数N,然后从0-N进行二分,如果mid最后一个数小于目标值说明0-mid中没有,舍弃,从mid+1到N-1行进行寻找。然后在进行二分直到找到或者便利完为止。代码如下:
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);}}
}