

从 右上角 或 左下角 出发
以 右上角 (0, cols-1) 为例:
当前值 x
- 如果 x == target → 找到了
- 如果 x > target → 这一列都比 target 大,左移
- 如果 x < target → 这一行都比 target 小,下移
每一步都能排除一整行或一整列
时间复杂度:O(m + n) :行最多走 m 次,列最多走 n 次。远不会访问同一个单元两次
空间复杂度:O(1): 只用了常数个变量,没有:递归、栈、额外数组、哈希表。空间复杂度 = O(1)
python
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
if not matrix or not matrix[0]:
return False
rows = len(matrix)
cols = len(matrix[0])
# 从右上角开始搜索
row = 0
col = cols - 1
while row < rows and col >= 0:
current = matrix[row][col]
if current == target:
return True
elif current > target:
# 当前值太大,往左移
col -= 1
else:
# 当前值太小,往下移
row += 1
return False