题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例:
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
思路: 这个题我真是一顿操作猛如虎,一看运行都不过😭,需要考虑的事比较多,变量初始值的选择也很重要。思想就是四个方向循环走。
(1)四个方向的初值全为0,当时真是不懂变通,为了运行出来浪费了我好多时间。
- 全为0的话,四个方向的值和clo,row就有关系,先找四个方向和clo,row的关系。
- 还需要设置个flag和tmp,来保证不会出现重复走的问题。
看图:
代码:
# include <iostream>
using namespace std;
#include <vector>
# include <string>
# include <stack>
# include<stdint.h>
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
vector<int> res;
if(matrix.size()==0)
return res;
int row=matrix.size()-1;//行
int clo=matrix[0].size()-1;//列
int x=0,y=0;
bool flag=false,tmp=true;//标识上一步走了,没走的话肯定不用走下面的,temp是防止出现第一步走了,第二步没走,flase还是为true;
while((x<row&&y<clo))
{
int R,D,L,U;
for(R=x;R<=clo-y;R++)//右
{
flag=true;
res.push_back(matrix[x][R]);
}
R-=1;//因为往右走R为3跳出的,记住放外面,不能放循环里面
tmp=flag;//记录上一步是否做了
flag=false;
for(D=y+1;D<=row-x;D++)//下
{
if(tmp!=true)
break;
flag=true;
res.push_back(matrix[D][R]);
}
tmp=flag;
flag=false;
D-=1;//同理;
for(L=R-1;L>=y;L--)//左
{
if(tmp!=true)
break;
flag=true;
res.push_back(matrix[D][L]);
}
L+=1;//往左走L=-1跳出,所以+1变为0
tmp=flag;
flag=false;
for(U=D-1;U>x;U--)//上
{
if(tmp!=true)
break;
flag=true;
res.push_back(matrix[U][L]);
}
x++;//从(0,0)(1,1)……开始绕圈的
y++;
}
return res;
}
int main()
{
vector<vector<int>> matrix;
vector<int> res;
int temp=1;
/**/for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
cout<<temp<<" ";
res.push_back(temp++);
}
cout<<endl;
matrix.push_back(res);
res.clear();
}
res.clear();
res=spiralOrder(matrix);
for(int i=0;i<res.size();i++)
{
cout<<res[i]<<" ";
}
}
看了书才发现我真年轻呀,将初始值进行改变就可以得到简单的做法。
(2)初始值R=clo,D=row,L=0,U=0;这样每次就利用四个方向来判断,不会牵扯到clo,row,我们看图:
代码:
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
vector<int> res;
if(matrix.size()==0)
return res;
int row=matrix.size()-1;//行
int clo=matrix[0].size()-1;//列
int R=clo,D=row,L=0,U=0;
while(1)
{
for(int j=L;j<=R;j++)//右
{
res.push_back(matrix[U][j]);
}
U++;
if(U>D) break;//防止访问已经访问过的
for(int j=U;j<=D;j++)//下
{
res.push_back(matrix[j][R]);
}
R--;
if(L>R) break;
for(int j=R;j>=L;j--)//左
{
res.push_back(matrix[D][j]);
}
D--;
if(U>D) break;
for(int j=D;j>=U;j--)//上
{
res.push_back(matrix[j][L]);
}
L++;
if(L>R) break;
}
return res;
}
加油哦!💪。