📜  排序矩阵中的搜索元素(1)

📅  最后修改于: 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$ 分别是矩阵的行数和列数。