给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出: [1,2,3,6,9,8,7,4,5]
思路
- 把矩阵当成积木一样,积木是由行和列堆叠而成的,所以我没记录积木的行和列的开始和结尾坐标
- 遍历一行的实质就是把积木拆解一行,所以记录下拆下的那一行就可以了
- 当所有行和列完全被拆除时,循环结束
代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int c = 0;
int r = 0;
int cm = matrix[0].size() - 1;
int rm = matrix.size() - 1;
vector<int> res((cm + 1) * (rm + 1));
int oper = 0; // 0 1 2 3
int count = 0; // 记录当前记录的数组,防止数组扩容(性能优化)
while(c <= cm && r <= rm) {
switch(oper) {
case 0:
for(int i = c; i <= cm; i++) res[count++] = matrix[r][i];
r++;
break;
case 1:
for(int i = r; i <= rm; i++) res[count++] = matrix[i][cm];
cm--;
break;
case 2:
for(int i = cm; i >= c; i--) res[count++] = matrix[rm][i];
rm--;
break;
case 3:
for(int i = rm; i >= r; i--) res[count++] = matrix[i][c];
c++;
break;
}
oper = (oper + 1) % 4;
}
return res;
}
};