📅  最后修改于: 2023-12-03 14:54:42.603000             🧑  作者: Mango
在排序矩阵中搜索元素是一种常见问题,排序矩阵是一个每行每列都按照升序排列的矩阵,因此可以利用这个特性来快速定位元素。
暴力法是最简单和直接的方法,遍历整个矩阵,直到找到目标元素。
def searchMatrix(matrix, target):
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == target:
return True
return False
暴力法遍历整个矩阵,因此时间复杂度为 $O(mn)$,其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
由于排序矩阵每行每列都是有序的,因此可以利用二分查找来快速定位元素。
先在第一列中二分查找目标元素所在的行,然后在该行中二分查找目标元素。
def searchMatrix(matrix, target):
if not matrix or not matrix[0]:
return False
m, n = len(matrix), len(matrix[0])
l, r = 0, m - 1
while l <= r:
mid = (l + r) // 2
if matrix[mid][0] == target:
return True
elif matrix[mid][0] < target:
l = mid + 1
else:
r = mid - 1
row = r
if row < 0:
return False
l, r = 0, n - 1
while l <= r:
mid = (l + r) // 2
if matrix[row][mid] == target:
return True
elif matrix[row][mid] < target:
l = mid + 1
else:
r = mid - 1
return False
时间复杂度为 $O(\log m + \log n)$,其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
可以利用矩阵的有序性质来缩小搜索范围。
从右上角开始搜索,如果目标元素比该元素大,那么目标元素必然在该元素下面的行,因为该元素所在的列已经排除。如果目标元素比该元素小,那么目标元素必然在该元素左边的列,因为该元素所在的行已经排除。
def searchMatrix(matrix, target):
if not matrix or not matrix[0]:
return False
m, n = len(matrix), len(matrix[0])
i, j = 0, n - 1
while i < m and j >= 0:
if matrix[i][j] == target:
return True
elif matrix[i][j] < target:
i += 1
else:
j -= 1
return False
时间复杂度为 $O(m + n)$,其中 $m$ 和 $n$ 分别是矩阵的行数和列数。