给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
如:
1,2,3
4,5,6
7,8,9
打印出:1,2,3,6,9,7,8,4,5
这种题解可以说治好了多年的便秘:
用四个变量up,down,left,right来控制遍历区域,进下一轮就一路走到底。每次进入下一条边之前,都要改变本条边遍历过的某个边界。
一旦某两条边重合,就说明遍历结束了。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int m = matrix.size(), n = matrix[0].size();
int up = 0, down = m - 1;
int left = 0, right = n - 1;
while (true)
{
for (int i = left; i <= right; i++)
res.push_back(matrix[up][i]); //从左向右走
if (++up > down) //判断下一步运动方向的两条边界是否重合
break;
for (int i = up; i <= down; i++)
res.push_back(matrix[i][right]);//在最右的边上走到最下方
if (left > --right) //一会儿要缩短外层
break;
for (int i = right; i >= left; i--)
res.push_back(matrix[down][i]);
if (up > --down)
break;
for (int i = down; i >= up; i--)
res.push_back(matrix[i][left]);
if (++left > right)
break;
}
return res;
}
};