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解题思路
核心思想:从右上角(或左下角)开始查找,利用矩阵的特性逐步缩小查找范围。
关键步骤:
- 从右上角元素开始,当前元素为
matrix[row][col] - 如果
matrix[row][col] > target,说明当前列所有元素都大于target,向左移动col-- - 如果
matrix[row][col] < target,说明当前行所有元素都小于target,向下移动row++ - 如果相等则返回
True - 超出边界则返回
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