
矩阵满足:
- 每行递增
- 下一行的第一个元素 > 上一行的最后一个元素
这意味着:整个矩阵如果按行"拉直",是一个严格递增的一维数组
所以可以直接用 二分查找。
不需要真的展开数组,只需要"映射索引"。
coffeescript
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m = len(matrix)
n = len(matrix[0])
left = 0
right = m * n - 1
while left <= right:
mid = (left+right)//2
row = mid // n # 不需要真的展开数组,只需要"映射索引"。
col = mid % n
if matrix[row][col] > target:
right = mid - 1
elif matrix[row][col] < target:
left = mid+1
else:
return True
return False # 找不到
时间复杂度 O(log(mn))
空间复杂度:O(1)