📜  在已排序的二维矩阵中搜索(以行主要顺序存储)(1)

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

在已排序的二维矩阵中搜索(以行主要顺序存储)

问题描述

在已排好序的二维矩阵中查找给定的值。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

考虑这样一个矩阵:

[
[1,   4,  7, 11, 15],
[2,   5,  8, 12, 19],
[3,   6,  9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]

给定目标值5,返回true

给定目标值20,返回false

解决方案
思路

一个朴素的想法是,从右上角开始,每次将搜索区间缩小一行或一列,直到找到目标值,或者搜索区间为空。

这种方法的正确性可以通过反证法来证明。假设这个方法无法找到目标值target,那么我们无法排除所有不包含目标值的行或列,因此必须排除所有行和列,从而排除整个矩阵,矛盾。

代码如下:

def searchMatrix(matrix, target):
    if not matrix:
        return False
        
    m, n = len(matrix), len(matrix[0])
    row, col = 0, n - 1
    
    while row < m and col >= 0:
        if matrix[row][col] == target:
            return True
        
        if matrix[row][col] < target:
            row += 1
        else:
            col -= 1
            
    return False
复杂度分析
  • 时间复杂度:O(m+n),其中m和n分别是数组的行数和列数。在算法的执行过程中,我们将矩阵的行或列至少减少一半,因此搜索的迭代次数不会超过m+n次。
  • 空间复杂度:O(1)。我们只需要常数的额外空间来存储一些变量。
测例答案

输入

matrix = [
    [1, 4, 7, 11, 15],
    [2, 5, 8, 12, 19],
    [3, 6, 9, 16, 22],
    [10, 13, 14, 17, 24],
    [18, 21, 23, 26, 30]
]
target = 5

输出

True

输入

matrix = [
    [1, 4, 7, 11, 15],
    [2, 5, 8, 12, 19],
    [3, 6, 9, 16, 22],
    [10, 13, 14, 17, 24],
    [18, 21, 23, 26, 30]
]
target = 20

输出

False