【Hot100】54. 螺旋矩阵
目录
- 引言
- 螺旋矩阵
- 我的解题
- 代码优化
- 🙋♂️ 作者:海码007
- 📜 专栏:算法专栏
- 💥 标题:【Hot100】54. 螺旋矩阵
- ❣️ 寄语:书到用时方恨少,事非经过不知难!
引言
螺旋矩阵
- 🎈 题目链接:https://leetcode.cn/problems/spiral-matrix/description/?envType=study-plan-v2&envId=top-100-liked
- 🎈 做题状态:
我的解题
虽然写出来了,但是代码也写的太丑陋了,感觉逻辑不清晰。但是其实我看了下官方题解,我的这个代码也不算是很复杂,虽然内容多,但是其实还是好理解的。
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {if (matrix.size() == 0) return {};vector<int> res; // 记录结果int row = matrix.size(); // 记录行边界int col = matrix[0].size(); // 记录列边界int n = row * col; // 数组总大小int i = 0;int j = 0; // 遍历起始点// 记录当前矩阵的四个边界值int up = 0; int down = matrix.size();int right = matrix[0].size();int left = 0;cout << "n = " << n << endl;while(res.size() < n){// 右for(;j < right ;++j){//cout << "i = " << i << "; j = " << j << "; matrix[i][j] = " << matrix[i][j] << endl;res.push_back(matrix[i][j]);}if (res.size() == n) break;--j;++i;++up; // 上边界下移一位// 下for(;i < down ;++i){//cout << "i = " << i << "; j = " << j << "; matrix[i][j] = " << matrix[i][j] << endl;res.push_back(matrix[i][j]);}if (res.size() == n) break;--i;--j;--right; // 右边界左移一位// 左for(; j >= left;--j){cout << "i = " << i << "; j = " << j << "; matrix[i][j] = " << matrix[i][j] << endl;res.push_back(matrix[i][j]);}if (res.size() == n) break;++j;--i;--down; // 下边界上移一位// 上for(; i >= up;--i){//cout << "i = " << i << "; j = " << j << "; matrix[i][j] = " << matrix[i][j] << endl;res.push_back(matrix[i][j]);}if (res.size() == n) break;++i;++j;++left; // 左边界右移一位}return res;}
};
代码优化
以下是优化后的代码,通过维护四个边界并使用更清晰的循环结构来简化逻辑:
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> res;if (matrix.empty()) return res;int top = 0, bottom = matrix.size() - 1;int left = 0, right = matrix[0].size() - 1;while (top <= bottom && left <= right) {// 向右遍历上边界for (int j = left; j <= right; ++j) {res.push_back(matrix[top][j]);}if (++top > bottom) break;// 向下遍历右边界for (int i = top; i <= bottom; ++i) {res.push_back(matrix[i][right]);}if (--right < left) break;// 向左遍历下边界for (int j = right; j >= left; --j) {res.push_back(matrix[bottom][j]);}if (--bottom < top) break;// 向上遍历左边界for (int i = bottom; i >= top; --i) {res.push_back(matrix[i][left]);}++left;}return res;}
};
优化说明:
-
边界管理: 使用四个变量
top
,bottom
,left
,right
分别表示当前未遍历区域的上下左右边界。每次处理完一个方向后,收缩对应的边界。 -
循环条件: 主循环继续的条件是
top <= bottom && left <= right
,确保存在未遍历的元素。 -
方向处理顺序: 按照右→下→左→上的顺序处理,每次处理完一个方向后立即检查是否需要终止循环,避免无效遍历。
-
简洁的循环结构: 每个方向的遍历使用明确的起点和终点,无需手动调整索引位置,代码更直观。
这种方法减少了冗余的条件检查,逻辑清晰,且避免了复杂的索引调整,提高了代码的可读性和健壮性。