1. LeetCode Hot 100矩阵问题概述
矩阵类问题在算法面试中占据重要地位,尤其在大厂技术面试中出现的频率极高。这类问题通常考察应聘者对二维数据结构的处理能力、边界条件的把控以及对空间/时间复杂度优化的敏感度。根据我多年参与大厂面试官的经验,矩阵问题在LeetCode Hot 100中约占15%的比例,是必须掌握的题型。
矩阵问题的典型特征包括:
- 输入数据以二维数组形式呈现
- 常涉及遍历顺序的特殊要求(如螺旋遍历、对角线遍历)
- 需要处理行列索引的边界条件
- 往往可以通过原地修改(in-place)来优化空间复杂度
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 矩阵问题的核心解题框架
2.1 基础遍历方法
矩阵问题的第一步永远是正确遍历。不同于一维数组,矩阵遍历需要考虑行列两个维度。以下是三种基础遍历方式及其C++实现:
cpp复制// 顺序遍历
for(int i = 0; i < rows; ++i) {
for(int j = 0; j < cols; ++j) {
// 处理matrix[i][j]
}
}
// 对角线遍历(左上到右下)
for(int d = 0; d < rows + cols - 1; ++d) {
for(int i = max(0, d - cols + 1); i <= min(d, rows - 1); ++i) {
int j = d - i;
// 处理matrix[i][j]
}
}
// 螺旋遍历
int top = 0, bottom = rows - 1, left = 0, right = cols - 1;
while(top <= bottom && left <= right) {
// 从左到右
for(int j = left; j <= right; ++j)
// 处理matrix[top][j]
top++;
// 从上到下
for(int i = top; i <= bottom; ++i)
// 处理matrix[i][right]
right--;
if(top <= bottom) {
// 从右到左
for(int j = right; j >= left; --j)
// 处理matrix[bottom][j]
bottom--;
}
if(left <= right) {
// 从下到上
for(int i = bottom; i >= top; --i)
// 处理matrix[i][left]
left++;
}
}
2.2 常见问题类型与解法
矩阵问题大致可分为以下几类,每种类型有其对应的解题模式:
-
搜索类问题:
- 典型题目:240. 搜索二维矩阵 II
- 解法特点:利用矩阵排序特性进行高效搜索
- 时间复杂度优化关键:从右上角或左下角开始搜索
-
路径类问题:
- 典型题目:64. 最小路径和
- 解法特点:动态规划,状态转移方程通常涉及上方和左侧单元格
- 空间优化技巧:原地修改或滚动数组
-
旋转/变换类问题:
- 典型题目:48. 旋转图像
- 解法特点:找到元素位置变换规律,常需要分层处理
- 易错点:边界条件的确定和索引计算
-
岛屿类问题:
- 典型题目:200. 岛屿数量
- 解法特点:DFS/BFS遍历,注意标记已访问单元格
- 优化方向:并查集解法
3. 高频矩阵题目精解
3.1 旋转图像(48题)
这是最经典的矩阵旋转问题,要求将n×n矩阵顺时针旋转90度。关键在于发现旋转前后位置的映射关系:
code复制旋转前位置:(i, j)
旋转后位置:(j, n-1-i)
最优解法是分层旋转,从
