解法:
思想:
复杂度:
●时间:O(mn)
●空间:O(1)
代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.empty() || matrix[0].empty())
return {
};
int m = matrix.size(), n = matrix[0].size();
int l = 0, r = n - 1, t = 0, b = m - 1;
vector<int>ans(m * n, 0);
int cnt = 0;
while(true){
for(int i = l; i <= r; i++)
//坐标很容易写错,要格外注意,是哪个坐标在变,哪边就是i
ans[cnt++] = matrix[t][i];
//图上看起来是++t与b重合,但是其实应该是判断大于
if(++t > b)
break;
for(int i = t; i <= b; i++)
ans[cnt++] = matrix[i][r];
if(--r < l)
break;
for(int i = r; i >= l; i--)
ans[cnt++] = matrix[b][i];
if(--b < t)
break;
for(int i = b; i >= t; i--)
ans[cnt++] = matrix[i][l];
if(++l > r)
break;
}
return ans;
}
};