Skip to content

01 二维数组中的查找

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例

输入: matrix = [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]], target = 7
输出: True

输入: matrix = [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]], target = 5
输出: False

解题思路

核心思想:从右上角(或左下角)开始查找,利用矩阵的特性逐步缩小查找范围。

关键步骤

  1. 从右上角元素开始,当前元素为 matrix[row][col]
  2. 如果 matrix[row][col] > target,说明当前列所有元素都大于target,向左移动 col--
  3. 如果 matrix[row][col] < target,说明当前行所有元素都小于target,向下移动 row++
  4. 如果相等则返回 True
  5. 超出边界则返回 False

时间复杂度:O(m + n),其中 m、n 为矩阵的行数和列数 空间复杂度:O(1)

Python 实现

python
def find_number_in_2d_array(matrix, target):
    """
    在二维数组中查找目标数字

    Args:
        matrix: 二维数组,每行递增,每列递增
        target: 目标数字

    Returns:
        bool: 是否找到目标数字
    """
    if not matrix or not matrix[0]:
        return False

    rows, cols = len(matrix), len(matrix[0])
    row, col = 0, cols - 1  # 从右上角开始

    while row < rows and col >= 0:
        if matrix[row][col] == target:
            return True
        elif matrix[row][col] > target:
            col -= 1  # 当前列都大于target,向左移动
        else:
            row += 1  # 当前行都小于target,向下移动

    return False


# 测试代码
if __name__ == "__main__":
    matrix = [
        [1, 2, 8, 9],
        [2, 4, 9, 12],
        [4, 7, 10, 13],
        [6, 8, 11, 15]
    ]

    print(find_number_in_2d_array(matrix, 7))   # True
    print(find_number_in_2d_array(matrix, 5))   # False
    print(find_number_in_2d_array(matrix, 1))   # True
    print(find_number_in_2d_array(matrix, 15))  # True

图解

初始矩阵:          从右上角(9)开始查找,target=7
[1,  2,  8,  9]
[2,  4,  9, 12]
[4,  7, 10, 13]
[6,  8, 11, 15]

步骤1: 9 > 7, 向左移动 → 8
步骤2: 8 > 7, 向左移动 → 2
步骤3: 2 < 7, 向下移动 → 9
步骤4: 9 > 7, 向左移动 → 4
步骤5: 4 < 7, 向下移动 → 7
步骤6: 7 == 7, 找到!返回True
最近更新

基于 MIT 许可发布