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不在矩阵的右上角,则每一次查找都去掉一行或一列,缩小查找范围
"""