1. 题目链接
2. 题目描述
编写一个高效的算法来搜索 m x n
矩阵 matrix
中的一个目标值 target
。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
3. 题目示例
示例 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
示例 2 :
输入: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
4. 解题思路
- 问题理解:
- 给定一个 m×n 的二维矩阵,其中:
- 每行从左到右升序排列
- 每列从上到下升序排列
- 需要判断目标值 target 是否存在于矩阵中
- 给定一个 m×n 的二维矩阵,其中:
- 关键思路:
- 搜索起点选择:
- 从矩阵的左下角(或右上角)开始搜索
- 这些位置具有特殊的单调性:向左递减,向上递增(或向右递增,向下递减)
- 搜索策略:
- 类似二叉搜索树的搜索过程
- 当前元素 > target:向上移动(行减小)
- 当前元素 < target:向右移动(列增加)
- 搜索起点选择:
5. 题解代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// 初始化指针位置:左下角元素
int i = matrix.length - 1; // 行指针,初始指向最后一行
int j = 0; // 列指针,初始指向第一列
// 搜索过程
while (i >= 0 && j < matrix[0].length) { // 确保指针在矩阵范围内
if (matrix[i][j] > target) {
i--; // 当前元素大于目标值,向上移动(行减小)
} else if (matrix[i][j] < target) {
j++; // 当前元素小于目标值,向右移动(列增加)
} else {
return true; // 找到目标值
}
}
// 遍历完未找到
return false;
}
}
6. 复杂度分析
- 时间复杂度:
- 最坏情况下需要遍历 m+n 次(从左下到右上)
- 时间复杂度为 O(m+n)
- 空间复杂度:
- 仅使用常数个额外空间
- 空间复杂度为 O(1)