1、二分查找,每行二分
// public boolean searchMatrix(int[][] matrix, int target) {
// //每层二分
// if (matrix == null || matrix.length == 0) return false;
// for (int i = 0; i < matrix.length; i++) {
// //每层二分
// int left = 0;
// int right = matrix[0].length - 1;
// while (left <= right){
// int mid = left + (right - left) / 2;
// if (matrix[i][mid] == target){
// return true;
// }else if (matrix[i][mid] > target){
// right = mid - 1;
// }else {
// left = mid + 1;
// }
// }
// }
// return false;
// }
2、先二分找到行,然后作为左下角,一直去缩小
// public boolean searchMatrix(int[][] matrix, int target) {
// if (matrix.length == 0 || matrix[0].length == 0) return false;
// return searchMatrix(matrix,target,0,matrix[0].length - 1,0,matrix.length - 1);
// }
// public boolean searchMatrix(int[][] matrix, int target,int left,int right,int up,int down) {
// //双层二分:找右上
// if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
// if (left > right || up > down) return false;
// if (left < 0) return false;
// //先找中间第一个大于target的
// //int left = 0;
// //int right = matrix.length;
// while (up <= down){
// int mid = up + (down - up) / 2;
// if (matrix[mid][left] == target) return true;
// if (matrix[mid][left] < target){
// up = mid + 1;//最后一个小于他的
// }else {
// down = mid - 1;
// }
// }
// return searchMatrix(matrix,target,left + 1,right,0,up - 1);
// }
3、找中间行,然后对中间行进行划分,找左下和右上
// public boolean searchMatrix(int[][] matrix, int target) {
// if (matrix.length == 0 || matrix[0].length == 0) return false;
// return search(matrix,target,0,matrix[0].length - 1,0,matrix.length - 1);
// }
// public boolean search(int[][] matrix,int target,int left,int right,int up,int down){
// if (left > right || up > down) return false;
// if (target < matrix[up][left] || target > matrix[down][right]) return false;
//
// int mid = (up + down) / 2;
// int midY = left;
// while (midY <= right && matrix[mid][midY] <= target){
// if (matrix[mid][midY] == target){
// return true;
// }
// midY++;
// }
// //再去左下和右上去找
// return search(matrix,target,left,midY - 1,mid + 1,down) ||
// search(matrix,target,midY,right,up,mid - 1);
// }
4、最好:从左下角开始,比他大向上,比他小向右
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix.length == 0 || matrix[0].length == 0) return false;
//从左下角开始走
int row = matrix.length - 1;
int col = 0;
while (row >= 0 && col < matrix[0].length) {
if (target == matrix[row][col]) {
return true;
}else if (target < matrix[row][col]){
row--;
}else {
col++;
}
}
return false;
}