Appearance
实战:搜索二维矩阵 II
LeetCode 240. 搜索二维矩阵 II | 难度:中等
与上一题不同,这个矩阵行与行之间没有严格的大小关系。
题目描述
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
- 每行的元素从左到右升序排列
- 每列的元素从上到下升序排列
示例:
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思路分析
这个矩阵不能直接展开为一维有序数组。
关键洞察:从右上角或左下角开始搜索。
以右上角为例:
- 如果当前值 > target,向左移动(排除当前列)
- 如果当前值 < target,向下移动(排除当前行)
- 如果相等,找到
代码实现
typescript
function searchMatrix(matrix: number[][], target: number): boolean {
const m = matrix.length;
const n = matrix[0].length;
// 从右上角开始
let row = 0;
let col = n - 1;
while (row < m && col >= 0) {
const val = matrix[row][col];
if (val === target) {
return true;
} else if (val > target) {
col--; // 当前值太大,向左
} else {
row++; // 当前值太小,向下
}
}
return false;
}为什么选右上角?
右上角:matrix[0][n-1]
- 向左:值减小
- 向下:值增大
可以根据比较结果确定唯一方向而左上角(值最小)和右下角(值最大)无法确定方向。
图示
target = 5
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
15 > 5, col--
11 > 5, col--
7 > 5, col--
4 < 5, row++
5 === 5, 返回 true复杂度分析
- 时间复杂度:O(m + n)
- 空间复杂度:O(1)
与搜索二维矩阵 I 的对比
| 题目 | 矩阵特点 | 算法 | 时间复杂度 |
|---|---|---|---|
| 版本 I | 完全有序 | 二分 | O(log(mn)) |
| 版本 II | 行列有序 | 右上角搜索 | O(m+n) |