74. Search a 2D Matrix - Medium
阿新 • • 發佈:2018-12-05
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.
Example 1:
Input: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 3 Output: true
Example 2:
Input: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 13 Output: false
用兩次binary search,第一次先確定行,第二次在確定的這一行裡查詢
注意判斷corner case!![], [[]] ...
通過bs找到top, down兩個邊界之後,判斷一下target和top行最後一個數的大小關係:如果target比較大,那麼在down中查詢,反之在top中查詢
確定了行tmp之後,同樣通過bs找到l, r兩個邊界,判斷l r 和target是否相等,如果兩個都不相等,返回false
time: O(logM + logN) -- M, N: row, col of matrix , space: O(1)
class Solution { public boolean searchMatrix(int[][] matrix, int target) { if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false; int top = 0, down = matrix.length - 1; while(top + 1 < down) { int mid = top + (down - top) / 2; if(matrix[mid][0] == target) return true; if(matrix[mid][0] > target) down = mid; else top = mid; } int tmp = target > matrix[top][matrix[0].length - 1] ? down : top; int l = 0, r = matrix[0].length - 1; while(l + 1 < r) { int mid = l + (r - l) / 2; if(matrix[tmp][mid] == target) return true; if(matrix[tmp][mid] > target) r = mid; else l = mid + 1; } if(matrix[tmp][l] == target || matrix[tmp][r] == target) return true; return false; } }