矩阵——螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
核心思路
用四个边界控制遍历范围:
- 上边界 top、下边界 bottom
- 左边界 left、右边界 right
- 按 **右→下→左→上 **顺序循环遍历,每遍历完一条边就收缩对应边界,直到边界交叉结束
完整代码实现如下:
#include
#include
using namespace std;
class Solution {
public:
vector
vector
if (matrix.empty()) return res; // 空矩阵直接返回
// 初始化四个边界
int top = 0;
int bottom = matrix.size() - 1;
int left = 0;
int right = matrix[0].size() - 1;
while (true) {
// 1. 从左到右 遍历上边界
for (int i = left; i <= right; ++i) {
res.push_back(matrix[top][i]);
}
if (++top > bottom) break; // 上边界下移,越界则结束
// 2. 从上到下 遍历右边界
for (int i = top; i <= bottom; ++i) {
res.push_back(matrix[i][right]);
}
if (--right < left) break; // 右边界左移,越界则结束
// 3. 从右到左 遍历下边界
for (int i = right; i >= left; --i) {
res.push_back(matrix[bottom][i]);
}
if (--bottom < top) break; // 下边界上移,越界则结束
// 4. 从下到上 遍历左边界
for (int i = bottom; i >= top; --i) {
res.push_back(matrix[i][left]);
}
if (++left > right) break; // 左边界右移,越界则结束
}
return res;
}
};
// 测试代码
int main() {
// 示例矩阵 3x3
vector<vector
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
Solution sol;
vector
// 输出结果
cout << "顺时针螺旋顺序:";
for (int num : result) {
cout << num << " ";
}
cout << endl;
return 0;
}
代码说明
1.边界初始化
- top = 0:最上面一行
- bottom = 矩阵行数-1:最下面一行
- left = 0:最左边一列
- right = 矩阵列数-1:最右边一列
2.四步循环遍历
左→右:遍历完上边界后,top++(上边界向下收缩)
上→下:遍历完右边界后,right--(右边界向左收缩)
右→左:遍历完下边界后,bottom--(下边界向上收缩)
下→上:遍历完左边界后,left++(左边界向右收缩)
3.终止条件
每次收缩边界后判断是否越界,一旦 top > bottom 或 left > right,说明所有元素遍历完成。
浙公网安备 33010602011771号