Skip to content

Latest commit

 

History

History
74 lines (54 loc) · 2.18 KB

74-search-a-2d-matrix.md

File metadata and controls

74 lines (54 loc) · 2.18 KB

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

 

示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

 

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

Solutions

1. 二分查找

先定位行,再定位值。

时间复杂度 O(log m + log n) = O(log m*n);空间复杂度 O(1)

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        if matrix[-1][-1] < target or matrix[0][0] > target:
            return False

        def findrow(l, r) -> int:
            if l + 1 == r:
                return l
            m = (l + r) // 2
            if matrix[m][0] <= target:
                return findrow(m, r)
            return findrow(l, m)

        r = findrow(0, len(matrix))

        def find(nums: List[int], l, r) -> bool:
            if l >= r:
                return nums[l] == target
            m = (l + r) // 2
            if nums[m] < target:
                return find(nums, m+1, r)
            return find(nums, l, m)

        return find(matrix[r], 0, len(matrix[r]) - 1)

题解中有个思路,将每行连起来看作是一个升序数组,一次二分查找即可。