一.相关链接
题目链接:54. 螺旋矩阵
二.心得体会
这道题与59类似,不同的一点是矩阵的行和列不一定相等,所以循环体大致不变,只需要在最后处理好中间剩下的那一行或者列的元素即可。
三.代码
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
int offset = 1;
int startm = 0;
int startn = 0;
//循环的圈数由小的那个维度来决定
int loop = m < n ? m/2 : n/2;
int loop_sub = loop;
vector<int> ans;
for(;loop>0;loop--){
startm = offset - 1;
startn = offset - 1;
for(int i=startn;i<n-offset;i++){
ans.push_back(matrix[startm][i]);
}
startn = n - offset;
for(int j=startm;j<m-offset;j++){
ans.push_back(matrix[j][startn]);
}
startm = m - offset;
for(int i=startn;i>=offset;i--){
ans.push_back(matrix[startm][i]);
}
startn = offset - 1;
for(int j=startm;j>=offset;j--){
ans.push_back(matrix[j][startn]);
}
offset++;
}
//哪个维度小,最终留下的元素就在哪个维度的中间取得,只需要忽略那一行(或者列)循环中已经遍历过的元素即可
if(ans.size()<m*n){
int select = m < n ? m : n;
if(select==m)
for(int i=loop_sub;i<n-loop_sub;i++)
ans.push_back(matrix[m/2][i]);
else if(select==n)
for(int i=loop_sub;i<m-loop_sub;i++)
ans.push_back(matrix[i][n/2]);
}
return ans;
}
};