59. 螺旋矩阵 II
54. 螺旋矩阵
剑指 Offer 29. 顺时针打印矩阵
螺弦矩阵II代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 1));
int l=0;
int r=n-1;
int t=0;
int b=n-1;
int num=1;
while(true){
//从左到右
for(int i=l;i<=r;i++){
res[t][i]=num++;
}
t++;
if(t>b){
break;
}
//从上到下
for(int i=t;i<=b;i++){
res[i][r]=num++;
}
r--;
if(r<l){
break;
}
//从右到左
for(int i=r;i>=l;i--){
res[b][i]=num++;
}
b--;
if(b<t){
break;
}
//从下到上
for(int i=b;i>=t;i--){
res[i][l]=num++;
}
l++;
if(l>r){
break;
}
}
return res;
}
};
螺弦矩阵和按顺序打印矩阵相同,代码:
if(matrix.empty()){ return {}; }
放在初始化后面超时了,目前还不知道为什么。class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.empty()){
return {};
}
vector<int>res;
int l=0;
int r=matrix[0].size()-1;
int t=0;
int b=matrix.size()-1;
while(true){
//从左到右
for(int i=l;i<=r;i++){
res.push_back(matrix[t][i]);
}
++t;
if(t>b){
break;
}
//从上到下
for(int i=t;i<=b;i++){
res.push_back(matrix[i][r]);
}
--r;
if(r<l)
{
break;
}
//从右到左
for(int i=r;i>=l;i--){
res.push_back(matrix[b][i]);
}
--b;
if(b<t){
break;
}
//从下到上
for(int i=b;i>=t;i--){
res.push_back(matrix[i][l]);
}
++l;
if(l>r)
{
break;}
}
return res;
}
};
总结:这种方法的好处就是避免了长方形矩阵和正方形矩阵不同,中间的值很难处理,通过边界的方式简化。