1. 程式人生 > >74. Search a 2D Matrix - Medium

74. Search a 2D Matrix - Medium

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; } }