fb86a25fba0c4696a4a93f0fe3c6fe6d.png
【题目】:54. 螺旋矩阵

class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int startx = 0, starty = 0; // 起始坐标
vector<int> res;
int m = matrix.size(), n = matrix[0].size();
int count = min(m, n) / 2;
int i, j;
int offset = 1;
// 填充边缘
while(count--) {
// 向右
for(j = startx; j < n - offset; ++j) {
res.push_back(matrix[startx][j]);
}
// 向下
for(i = starty; i < m - offset; ++i) {
res.push_back(matrix[i][j]);
}
// 向左
for(; j > starty; --j) {
res.push_back(matrix[i][j]);
}
// 向上
for(; i > startx; --i) {
res.push_back(matrix[i][j]);
}
++offset;
++startx;
++starty;
}
// 考虑只剩一行的情况
if(m <= n && m % 2 == 1) {
for(; starty <= n - offset; ++starty) {
res.push_back(matrix[startx][starty]);
}
}
// 考虑只剩一列的情况
if(n < m && n % 2 == 1) {
for(; startx <= m - offset; ++startx) {
res.push_back(matrix[startx][starty]);
}
}
return res;
}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

这题主要是要抓住循环不变量,每次一圈循环都应该遵循左闭右开的原则。
498811d5936948cab45002fbc6a1e84e.png
由于题目不一定是个正方形,所以最后要考虑只剩一行只剩一列的情况
e989b2988f544c72bda25fafe68b8a57.png