先列举几种情况
观察一下,思路其实可以归纳为从起点(0,0)开始
先往左走,没有办法往左走了(到了边界或者是左边的格子已经走过了)就往下走,
不能往下走了以后就往右走,
不能往右走了以后就往上走,
不能往上走了以后就往左走。
直到有一个格子四个方向都不能走了,就结束循环。
所以我们设立一个visit数组,visit[i][j]表示(i,j)位置之前有没有访问过
然后建立dir数组,来表示当前的方向,如果当前方向不能走了,用(t+1)%4就可以进行以上的变换了。
c++
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> ans;
int m = matrix.size();
if(m==0){ return ans; }
int n = matrix[0].size();
if(n==0){ return ans; }
vector<vector<bool> > visit(m);
for(int i = 0 ; i < m ; i++) { visit[i].resize(n); }
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int t = 0;//走哪个方向,0右 1下 2左 3上
int x = 0,y = 0;
bool end = false;
while(!end)
{
ans.push_back(matrix[x][y]);
visit[x][y] = true;
for(int i = 0 ; i < 5 ; i++)//如果现在的位置四个方向都不能走了,循环就可以结束了。
{
if(i == 4){end = true;break;}
int tx = x + dir[t][0];
int ty = y + dir[t][1];
if(tx >= 0 && tx < m && ty >= 0 && ty < n && !visit[tx][ty])
{
x = tx;
y = ty;
break;
}
else{//失败了,换方向走
t = (t+1)%4;
}
}
}
return ans;
}
};
java
import java.util.*;
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> ans = new ArrayList<Integer>();
int m = matrix.length;
if(m==0){ return ans; }
int n = matrix[0].length;
if(n==0){ return ans; }
boolean[][] visit = new boolean[m][n];
int dir[][]={{0,1},{1,0},{0,-1},{-1,0}};
int t = 0;//走哪个方向,0右 1下 2左 3上
int x = 0,y = 0;
boolean end = false;
while(!end)
{
ans.add(matrix[x][y]);
visit[x][y] = true;
for(int i = 0 ; i < 5 ; i++)//如果现在的位置四个方向都不能走了,循环就可以结束了。
{
if(i == 4){end = true;break;}
int tx = x + dir[t][0];
int ty = y + dir[t][1];
if(tx >= 0 && tx < m && ty >= 0 && ty < n && !visit[tx][ty])
{
x = tx;
y = ty;
break;
}
else{//失败了,换方向走
t = (t+1)%4;
}
}
}
return ans;
}
}
python
class Solution:
def spiralOrder(self , matrix ):
ans = []
m = len(matrix)
if m==0:
return ans
n = len(matrix[0])
if n==0:
return ans
visit = [[False for i in range(n)] for j in range(m)]
dir =[[0,1],[1,0],[0,-1],[-1,0]]
t = 0#走哪个方向,0右 1下 2左 3上
x = 0
y = 0
end = False
while end==False:
ans.append(matrix[x][y])
visit[x][y] = True
for i in range(0,5):#如果现在的位置四个方向都不能走了,循环就可以结束了。
if i == 4:
end = True
break
tx = x + dir[t][0]
ty = y + dir[t][1]
if tx >= 0 and tx < m and ty >= 0 and ty < n and visit[tx][ty]==False:
x = tx
y = ty
break
else:#失败了,换方向走
t = (t+1)%4;
return ans

京公网安备 11010502036488号