Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
1 2 3 4 5 6
| [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ]
|
Given target = 3
, return true
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public boolean searchMatrix(int[][] matrix, int target) { if(matrix == null || matrix.length == 0) return false; int m = matrix.length; int n = matrix[0].length; int start = 0; int end = m-1; while(start < end){ int mid = start + ((end - start + 1)>>1); if(matrix[mid][0] <= target) start = mid; else end = mid-1; } int row = start; start = 0; end = n-1; while(start <= end){ int mid = start + ((end - start)>>1); if(matrix[row][mid] == target){ return true; } if(start == end) return false; else if(matrix[row][mid] < target) start = mid + 1; else end = mid; } return false; } }
|
- 运用两次二分查找的方法先确定元素所在行数,然后在该行进行查找。
- 注意返回false的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public boolean searchMatrix(int[][] matrix, int target) { if(matrix == null || matrix.length == 0) return false; int i = 0; int j = matrix[0].length-1; while(i < matrix.length && j >= 0){ if(matrix[i][j] == target) return true; else if(matrix[i][j] < target) i++; else j--; } return false; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public boolean searchMatrix(int[][] matrix, int target) { if(matrix == null || matrix.length == 0) return false; int m = matrix.length; int n = matrix[0].length; int start = 0; int end = m * n - 1; while(start <= end){ int mid = start + ((end - start)>>1); if(matrix[mid/n][mid%n] == target) return true; else if(matrix[mid/n][mid%n] < target) start = mid + 1; else end = mid-1; } return false; } }
|
- 直接将整个二维数组看成是一个一维数组,直接一次二分搜索就好