给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length n == matrix[i].length 1 <= m, n <= 10 -100 <= matrix[i][j] <= 100
思路
使用了一个双重循环,外层循环控制螺旋遍历的层数,内层循环控制在每一层中的具体遍历过程。遍历过程中,算法会根据当前的方向(由变量dir表示)来决定下一步的行动。dir的取值范围是0到3,分别代表向右、向下、向左、向上四个方向。
在每次遍历时,算法会根据当前的方向将矩阵中的元素添加到结果向量vr中,同时更新遍历的计数器cnt。当cnt达到矩阵的元素总数时,遍历结束。
此外,算法还使用了四个变量u、d、l和r来记录当前层的上下左右边界,这四个变量在每次遍历后会相应地更新,以确保下一次遍历时能正确地进入下一层。
AC代码
/*
* @lc app=leetcode.cn id=54 lang=cpp
*
* [54] 螺旋矩阵
*/
// @lc code=start
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> vr;
int m = matrix.size();
int n = matrix[0].size();
int u, d, l, r;
int x, y, dir;
int cnt = 0;
x = -1;
y = 0;
u = l = 0;
r = n;
d = m;
dir = 0;
while (cnt < m * n) {
switch (dir) {
case 0:
do {
x++;
vr.push_back(matrix[y][x]);
cnt++;
} while (x + 1 < r);
u++;
break;
case 1:
do {
y++;
vr.push_back(matrix[y][x]);
cnt++;
} while (y + 1 < d);
r--;
break;
case 2:
do {
x--;
vr.push_back(matrix[y][x]);
cnt++;
} while (x - 1 >= l);
d--;
break;
case 3:
do {
y--;
vr.push_back(matrix[y][x]);
cnt++;
} while (y - 1 >= u);
l++;
break;
}
dir = (dir + 1) % 4;
}
return vr;
}
};
// @lc code=end