public class searchMatrix { //方法一:确定行号,进行二分查找 public static boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length; int n = matrix[0].length; if(target<matrix[0][0]||target>matrix[m-1][n-1]||m==0){ return false; } int low = 0; int high = matrix[0].length-1; for (int i = 0; i <m ; i++) { if(target>=matrix[i][0]&&target<=matrix[i][n-1]){ //那么就当前一行找 while (low<=high){ int mid = (low+high)/2; if(matrix[i][mid]<target){ low = mid+1;//取右半部分 }else if (matrix[i][mid]>target){ high = mid -1; }else { return true; } } break; } } return false; } //方法二:二维转一维 public static boolean searchMatrix2(int[][] matrix, int target) { //先定义m和n int m = matrix.length; if(m==0) return false; int n = matrix[0].length; //二分查找,定义左右指针 int left = 0; int right = m*n-1; while (left<=right){ //计算中间位置 int mid = (left+right)/2; //计算二位数组中对应的行列号,取出对应元素 int midElement = matrix[mid/n][mid%n]; //判断中间元素与target大小关系 if(midElement<target){ left = mid+1; }else if(midElement>target){ right = mid-1; }else { return true; } } return false; } public static void main(String[] args) { int[][] arr ={ {1,3,5,7}, {10,11,16,20}, {23,30,34,60} }; int target = 34; boolean flag = searchMatrix2(arr,target); System.out.println(flag); } }