📅  最后修改于: 2023-12-03 15:28:45.031000             🧑  作者: Mango
有一个 n*n 的矩阵,它的每一行和每一列都是升序排列的。现在给定一个整数 x,查找矩阵中是否存在数 x。
def search_in_matrix(matrix: List[List[int]], target: int) -> bool:
pass
matrix
:一个 n* n 的矩阵,每一行和每一列都是升序排列的。target
:一个整数。输入:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
target = 5
输出:
True
输入:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
target = 10
输出:
False
题目要求查找一个数是否存在于矩阵中,时间复杂度要求尽可能小。由于矩阵的每行和每列都是升序排列的,因此我们可以考虑利用这个性质,每次比较矩阵的某个元素与目标值的大小关系:
from typing import List
def search_in_matrix(matrix: List[List[int]], target: int) -> bool:
# 矩阵为空,返回 False
if not matrix:
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
由于每次搜索都能将矩阵的规模缩小为原来的 1/2,因此时间复杂度为 $O(\log n)$。