240. Search a 2D Matrix II

题目描述

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例:

现有矩阵 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]
]

给定 target = 5,返回 true

给定 target = 20,返回 false

我的解法——二分法(AC)

  • m次二分查找
  • 时间复杂度O(nlogn),空间复杂度O(1)
  • Beat30%
class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        m = len(matrix)
        if(m == 0):return False
        n = len(matrix[0])
        if(n == 0):return False
        
        for nums in matrix:
            l = 0
            r = n - 1
            while(l <= r):
                mid = int((r - l)/2 + l)
                if(nums[mid] == target):
                    return True
                elif(nums[mid] > target):
                    r = mid - 1
                else:
                    l = mid + 1
        return False

最优解法

  • 分治法求解,首先根据矩阵的特点,横向和纵向是分别升序的。可以从右上角或者左下角进行判断。拿左下角来说

    • 如果比target大,那么需要往上走,因为当前行的右边都比它大
    • 如果比target小,那么需要往右走,因为当前列的上面比它都小
    • 相等则命中

  • 时间复杂度O(m+n) n 为行数,m为列数。