思路:
直接模拟。注意循环时左闭右开为下一个留一个开头。
还有四个边界同时往内缩一圈。奇偶的问题写在下面。
储备:
54. 螺旋矩阵 - 力扣(LeetCode) 这个题解写的比较好
54. 螺旋矩阵 - 力扣(LeetCode) 这两个题解差不多的。但要追求左闭右开和while循环条件直观,所以看第一个好。
问题重点:
1、一开始初始化,矩阵的直接左闭右闭。在遍历时额外为下一步留一个开头才左闭右开。
2、四个边界同时网内缩,偶数则会相邻后错开,奇数则会隔一个后相等。
只要上下和左右 其中一对错开或者相等了,另一对一定只剩一行就能完成。因为从二维降到一维了。
无论上下奇数还是左右奇数,无论一个还是两个,都只需要补充一次。且这一次补充是左闭右闭的。因为不需要为下一步留开头了;
最后:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
if (matrix.size()==0) return ans;//为空
//赋值上下左右边界
int u=0;
int d=matrix.size()-1;
int l=0;
int r=matrix[0].size()-1;//要到头。循环里会额外留一个。
while (l<r && u<d) {
//循环左闭右开。每行留一个作为下一步的起点。
for (int j=l;j<r;j++) ans.push_back(matrix[u][j]);//上行
for (int i=u;i<d;i++) ans.push_back(matrix[i][r]);//右列
for (int j=r;j>l;j--) ans.push_back(matrix[d][j]);//下行
for (int i=d;i>u;i--) ans.push_back(matrix[i][l]);//左列
//成对相加减。四个边界同时往内缩。留下相等的情况单独讨论。
//偶数。则会在相邻后错开。奇数,则会在相邻后相等。只要其中一对相等就会退出循环。
//若同时奇数。则只需要补充一次
u++;
l++;
d--;
r--;
}
//相等时,不用为下一个留个开头了。所以左闭右闭。
if (l==r) for (int i=u;i<=d;i++) ans.push_back(matrix[i][l]);
//若同时奇数,则只需要补充一次。所以用else
else if (u==d) for (int j=l;j<=r;j++) ans.push_back(matrix[u][j]);
return ans;
}
};

562

被折叠的 条评论
为什么被折叠?



