题目描述
矩阵每行、每列都升序,判断 target 是否存在。
matrix = 行列均升序, target=5
输出 = true
思路解析
关键不是背模板,而是看懂为什么这题适合矩阵 · 右上角搜索。
1. 右上角同时是这一行最大、这一列最小:右上角同时是这一行最大、这一列最小
2. 当前值比 target 大,整列下面更大,左移:当前值比 target 大,整列下面更大,左移
3. 当前值比 target 小,整行左边更小,下移:当前值比 target 小,整行左边更小,下移
4. 每一步排除一行或一列:每一步排除一行或一列
5. 不会回头,路径是折线:不会回头,路径是折线
6. 遇到 5 直接返回 true:遇到 5 直接返回 true
7. 走出边界说明不存在:走出边界说明不存在
8. 复杂度只和行列边长相加有关:复杂度只和行列边长相加有关
把这句话记住,下次遇到同类题,就能更快选出方向。
用一个小问题检查自己是不是真的懂了。
参考代码(Python)
Python
1class Solution:
2 def searchMatrix(self, matrix, target):
3 r, c = 0, len(matrix[0]) - 1
4 while r < len(matrix) and c >= 0:
5 if matrix[r][c] == target:
6 return True
7 if matrix[r][c] > target:
8 c -= 1
9 else:
10 r += 1
11 return False复杂度分析
- 时间复杂度:O(m+n) —— 每个核心状态按算法要求处理固定次数
- 空间复杂度:O(1) —— 只保存必要的辅助结构或递归栈
套路模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
Python
1# 矩阵 · 右上角搜索 通用检查表
2# 1. 定义状态/指针/容器
3# 2. 每轮只做一个清晰动作
4# 3. 更新答案并处理边界易错点
- 错误写法:从左上角开始 → 正确写法:从右上或左下这种能排除一行/列的位置开始(左上太小无法判断该往哪边走)
- 错误写法:只按样例推代码 → 正确写法:先写清状态含义和边界条件(样例太少,隐藏用例专打边界)
- 错误写法:变量名和动画不一致 → 正确写法:代码变量沿用动画里的核心名字(学习时最怕脑内维护两套概念)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。