leetcode074.搜索二维矩阵(含lc240题解)

94 阅读1分钟

074.搜索二维矩阵(含lc240题解)

判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。
class Solution:  # 上面leetcode074,下面leetcode240
    # 每行中的整数从左到右按升序排列,每行的第一个整数大于前一行的最后一个整数
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        if not matrix or target is None:
            return False

        m, n = len(matrix), len(matrix[0])
        lo, hi = 0, m * n - 1
        while lo <= hi:
            mid = (lo + hi) // 2
            num = matrix[mid // n][mid % n]
            if num == target:
                return True
            elif num < target:
                lo = mid + 1
            else:
                hi = mid - 1
        return False
"""
注意到输入的 m x n 矩阵可以视为长度为 m x n的有序数组。
由于该虚数组的序号可以由下式方便地转化为原矩阵中的行和列,
该有序数组非常适合二分查找。
row = idx // n ; col = idx % n (idx为虚数组中元素的下标)
"""

  # 每一行从左到右递增,每一列从上到下递增,但不满足每行的第一个整数大于前一行的最后一个整数
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        if not matrix or target is None:
            return False

        row, col = 0, len(matrix[0]) - 1  # 第一行末尾,即右上角
        while row < len(matrix) and col >= 0:
            if matrix[row][col] == target:
                return True
            elif matrix[row][col] < target:
                row += 1
            else:
                col -= 1
        return False
"""
双指针从右上角(base=matrix[row][col])查找:base==target返回true
- 如果base<target,指针下移
- 如果base>target,指针左移
若target不在矩阵的右上角,则每一次查找都去掉一行或一列,缩小查找范围
"""