题目描述
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
题目分析
- 根据题意可知,我们不需要记录已经走过的路径,只需要通过调整矩阵的上下左右边界即可完成任务;
- 首先创建出矩阵的上下左右边界;
- 开始遍历矩阵:
先从左上角,从左向右遍历第一行,然后删除第一行,即重新定义上边界;
然后判断重新定义后的上下边界是否交错,如果交错,则表示螺旋矩阵遍历结束,跳出循环,返回数组;
如果重新定义后的边界没有交错,则接着遍历矩阵; - 使用3中类似的逻辑接着向下向左向上移动;
- 不断循环步骤3和4,直至某两个边界交错,跳出循环为止,最后返回结果。
Code
cpp
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.empty()) return {};
vector<int> res;
res.reserve(matrix.size()*matrix[0].size()); //预分配容器的大小
int upper = 0, down = matrix.size() - 1;
int left = 0, right = matrix[0].size() - 1;
while (true) {
// 向右遍历
for (int i = left; i <= right; ++i) {
res.emplace_back(matrix[upper][i]);
}
if (++upper > down) {
break;
}
// 向下遍历
for (int i = upper; i <= down; ++i){
res.emplace_back(matrix[i][right]);
}
if (--right < left) {
break;
}
// 向左遍历
for (int i = right; i >= left; --i) {
res.emplace_back(matrix[down][i]);
}
if (--down < upper) {
break;
}
// 向上遍历
for (int i = down; i >= upper; --i) {
res.emplace_back(matrix[i][left]);
}
if (++left > right) {
break;
}
}
return res;
}
};