LeetCode 54 螺旋矩阵 题解:螺旋矩阵的C++实现
一、题目解读
LeetCode 54题“螺旋矩阵”要求将给定的二维矩阵元素按螺旋顺序(顺时针)排列为一维数组。例如,对于矩阵[[1,2,3],[4,5,6],[7,8,9]],输出应为[1,2,3,6,9,8,7,4,5]。题目考察对矩阵遍历路径的规划能力,需确保不重复访问元素且顺序正确。
二、解题思路
通过维护上下左右四条边界动态控制遍历方向。核心思想是:按层处理矩阵,每层分为上→右→下→左四个方向遍历,访问完当前方向后调整边界,直至所有元素被访问。这种方法避免复杂坐标计算,利用循环与边界判断实现简洁逻辑。
三、解题步骤
1. 初始化:判断矩阵是否为空,若为空直接返回空数组。
2. 定义边界:top=0, bottom=m-1, left=0, right=n-1(m为行数,n为列数)。
3. 循环遍历:
○ 上层:从左到右遍历,res添加matrix[top][i],top++更新下边界。
○ 右层:从上到下遍历,添加matrix[i][right],right--更新左边界。
○ 下层:从右到左遍历,添加matrix[bottom][i],bottom--更新上边界。
○ 左层:从下到上遍历,添加matrix[i][left],left++更新右边界。
○ 每轮遍历后检查边界是否交叉(如top>bottom或left>right),若交叉则结束循环。
4. 返回结果:最终res即为螺旋顺序元素序列。
四、代码与注释
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if (matrix.empty()) return {}; // 空矩阵特判 vector<int> res; // 结果数组 int m = matrix.size(), n = matrix[0].size(); // 记录行列数 int top = 0, bottom = m - 1, left = 0, right = n - 1; // 初始化边界 while (true) { // 从左到右遍历上层 for (int i = left; i <= right; ++i) res.push_back(matrix[top][i]); // 添加元素,top上移 if (++top > bottom) break; // 上边界越界则终止 // 从上到下遍历右层 for (int i = top; i <= bottom; ++i) res.push_back(matrix[i][right]); // 添加元素,right右移 if (--right < left) break; // 右边界越界终止 // 从右到左遍历下层 for (int i = right; i >= left; --i) res.push_back(matrix[bottom][i]); // 添加元素,bottom下移 if (--bottom < top) break; // 下边界越界终止 // 从下到上遍历左层 for (int i = bottom; i >= top; --i) res.push_back(matrix[i][left]); // 添加元素,left左移 if (++left > right) break; // 左边界越界终止 } return res; } };
五、总结
1. 核心技巧:利用边界变量将复杂路径分解为四个方向的循环遍历,通过动态调整边界简化逻辑。
2. 时间复杂度:O(mn)(m行n列,每个元素被访问一次)。
3. 优化方向:可进一步思考坐标递推方法,但模拟法更直观易懂,适合新手理解。
4. 应用场景:类似“环形遍历”问题,需按特定路径访问多维数据时,边界控制是通用思路。
原创内容 转载请注明出处