矩阵为m×n,环数为min(m,n)/2,设p,q为环的高度和宽度
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.empty() || matrix[0].empty()) return {};
vector<int> res;
int m=matrix.size(),n=matrix[0].size();
int c=m>n?(n+1)/2:(m+1)/2;
int p=m,q=n;
for(int i=0;i<c;i++,p-=2,q-=2){
for(int col=i;col<i+q;col++) res.push_back(matrix[i][col]);
for(int row=i+1;row<i+p;row++) res.push_back(matrix[row][i+q-1]);
if(p==1||q==1) break;
for(int col=i+q-2;col>=i;col--) res.push_back(matrix[i+p-1][col]);
for(int row=i+p-2;row>=i+1;row--) res.push_back(matrix[row][i]);
}
return res;
}
};
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();
vector<int> res;
int up = 0, down = m - 1, left = 0, right = n - 1;
while (true) {
for(int j=left;j<=right;j++) res.push_back(matrix[up][j]);
if(++up>down) break;
for(int i=up;i<=down;i++) res.push_back(matrix[i][right]);
if(--right<left) break;
for(int j=right;j>=left;j--) res.push_back(matrix[down][j]);
if(--down<up) break;
for(int i=down;i>=up;i--) res.push_back(matrix[i][left]);
if(++left>right) break;
}
return res;
}
};