思路:就是一个模拟,跟紫书上那道蛇形矩阵一样,紫书讲的很好,首先模拟顺序是右下左上,用一个vis数组标记访问过的点,每次走之前需要先判断能不能走而不是先走,这样避免了越界问题。O(n*m)
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > e) {
int cnt=1,x=0,y=0,n=e.size(),m=e[0].size();
int vis[n+5][m+5];
memset(vis,0,sizeof vis);
vector<int>res;
res.push_back(e[0][0]);
vis[0][0]=1;
while(1){
if(cnt==n*m)break;
while(y+1<m&&!vis[x][y+1]){
y++;
res.push_back(e[x][y]);
vis[x][y]=1;
cnt++;
}
while(x+1<n&&!vis[x+1][y]){
x++;
res.push_back(e[x][y]);
vis[x][y]=1;
cnt++;
}
while(y-1>=0&&!vis[x][y-1]){
y--;
res.push_back(e[x][y]);
vis[x][y]=1;
cnt++;
}
while(x-1>=0&&!vis[x-1][y]){
x--;
res.push_back(e[x][y]);
vis[x][y]=1;
cnt++;
}
}
return res;
}
}; 
京公网安备 11010502036488号