📌  相关文章
📜  搜索按行和按列排序的矩阵(1)

📅  最后修改于: 2023-12-03 15:39:52.100000             🧑  作者: Mango

搜索按行和按列排序的矩阵

在搜索一个按行和按列排序的矩阵时,可以采用类似二分查找的方法来进行搜索。具体而言,我们可以选择从矩阵的左下角或者右上角开始,在每一步减少一行或者一列的搜索范围。

按行排序的矩阵

假设我们要搜索一个按行排序的矩阵,也就是说,每一行的元素都按照从小到大的顺序排列。我们可以从矩阵的左下角开始进行搜索。当前位置的元素 A[i][j] 有三种可能的情况:

  • A[i][j] == target:找到目标元素,返回 true。
  • A[i][j] < target:由于当前元素 A[i][j] 已经是当前行最大的元素,因此我们应该将搜索范围缩小到 i+1 行。
  • A[i][j] > target:由于当前元素 A[i][j] 已经是当前列最小的元素,因此我们应该将搜索范围缩小到 j-1 列。

不断重复上述过程,直到找到目标元素或者搜索范围为空。

def search_matrix(matrix, target):
    m, n = len(matrix), len(matrix[0])
    i, j = m - 1, 0
    while i >= 0 and j < n:
        if matrix[i][j] == target:
            return True
        elif matrix[i][j] < target:
            j += 1
        else:
            i -= 1
    return False
按列排序的矩阵

如果矩阵按列排序而不是按行排序,我们可以从矩阵的右上角开始进行搜索。当前位置的元素 A[i][j] 有三种可能的情况:

  • A[i][j] == target:找到目标元素,返回 true。
  • A[i][j] < target:由于当前元素 A[i][j] 已经是当前列最小的元素,因此我们应该将搜索范围缩小到 j+1 列。
  • A[i][j] > target:由于当前元素 A[i][j] 已经是当前行最大的元素,因此我们应该将搜索范围缩小到 i-1 行。
def search_matrix(matrix, target):
    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$ 分别为矩阵的行数和列数。