代码改变世界

[LeetCode] 240. Search a 2D Matrix II_Medium tag: Binary Search

2018-08-31 06:21  Johnson_强生仔仔  阅读(279)  评论(0编辑  收藏  举报

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 in ascending from left to right.
  • Integers in each column are sorted in ascending from top to bottom.

Example:

Consider the following matrix:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

Given target = 5, return true.

Given target = 20, return false.

这个题目思路, 1. brute force  T: O(m*n)    2. T: O(m+n)     3. T: O(lg(n!))  先找第一行, 第一列, 2n 再从(1,1) 开始扫第二行第二列, 2(n-1), .... 所以是lgn + lg (n-1) + lg(n-2)...lg(1) = lg(n!)

1) T: O(m*n)

两个for loop即可.

2) T: O(m + n)

        #O(n + m) , O(1)
        if not matrix or len(matrix[0]) == 0: return False
        lr, lc = len(matrix), len(matrix[0])
        r, c = lr - 1, 0
        while r >= 0 and c < lc:
            if matrix[r][c] > target:
                r -= 1
            elif matrix[r][c] < target:
                c += 1
            else:
                return True
        return False

 

 

3)  T: O(lg(n!)) 

        # T: O(lg(n!))   S: O(1)
        def helper(i, flag):
            l = i
            r = lrc[0]-1 if flag == 'row' else lrc[1] -1
       if flag == 'col': while l + 1 < r: mid = l + (r - l)//2 if matrix[i][mid] > target: r = mid elif matrix[i][mid] < target: l = mid else: return True if target in [matrix[i][l], matrix[i][r]]: return True return False else: while l + 1 <r: mid = l + (r - l)//2 if matrix[mid][i] > target: r = mid elif matrix[mid][i] < target: l = mid else: return True if target in [matrix[l][i], matrix[r][i]]: return True return False if not matrix or len(matrix[0]) == 0: return False lrc = [len(matrix), len(matrix[0])] for i in range(min(lrc)): row_check = helper(i, "row") col_check = helper(i, "col") if row_check or col_check: return True return False