240. 搜索二维矩阵 II
1.1 核心思想
- 问题描述:给定一个
m x n
的二维矩阵,矩阵的每一行从左到右递增,每一列从上到下递增。判断目标值target
是否存在于矩阵中。 - 解决思路:
- 从矩阵的右上角(或左下角)开始搜索。
- 如果当前元素等于
target
,返回True
。 - 如果当前元素小于
target
,则排除当前行(因为当前行的所有元素都小于target
)。 - 如果当前元素大于
target
,则排除当前列(因为当前列的所有元素都大于target
)。 - 重复上述步骤,直到找到
target
或搜索完整个矩阵。
1.2 具体步骤
- 初始化:
- 获取矩阵的行数
m
和列数n
。 - 初始化指针
i
和j
,分别指向矩阵的右上角(i = 0
,j = n - 1
)。
- 获取矩阵的行数
- 搜索过程:
- 如果
matrix[i][j] == target
,返回True
。 - 如果
matrix[i][j] < target
,说明当前行的所有元素都小于target
,因此向下移动一行(i += 1
)。 - 如果
matrix[i][j] > target
,说明当前列的所有元素都大于target
,因此向左移动一列(j -= 1
)。
- 如果
- 终止条件:
- 如果
i
超出矩阵的行数或j
小于 0,说明搜索完整个矩阵仍未找到target
,返回False
。
- 如果
灵神的方法真的秒啊!
class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: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 # 找到 targetif matrix[i][j] < target:i += 1 # 这一行剩余元素全部小于 target,排除else:j -= 1 # 这一列剩余元素全部大于 target,排除return False
- 时间复杂度:O(m+n),其中 m 和 n 分别为 matrix 的行数和列数。
- 空间复杂度:O(1)。