Solution 1:
做这题的时候想到前面题有用过direction这种方法。
发现规律是右,下,左,上。
比较直白。
就是记住每次换方向的时候都越界了,要挪回来。
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
if(matrix==null||matrix.length==0)return new ArrayList<>();
int i=-1;
int j=-1;
int direction=1;
int sum=matrix[0].length*matrix.length;
int count=0;
List<Integer> list=new ArrayList<>();
//System.out.print(sum+" ");
boolean[][] used=new boolean[matrix.length][matrix[0].length];
while(count<sum){
if(direction==1){
j++;
i++;//向上结束的时候越界了,i刚进来是-1,所以++
while(j<=matrix[0].length-1 && !used[i][j]){
list.add(matrix[i][j]);//System.out.print(matrix[i][j]+" ");
used[i][j]=true;
j++;
count++;
}
direction=2;
}
else if(direction==2){
i++;
j--;
while(i<=matrix.length-1 && !used[i][j]){
list.add(matrix[i][j]);//System.out.print(matrix[i][j]+" ");
used[i][j]=true;
i++;
count++;
}
direction=3;
}
else if(direction==3){
j--;
i--;
while(j>=0 && !used[i][j]){
list.add(matrix[i][j]);
//System.out.print(matrix[i][j]+" ");
used[i][j]=true;
j--;
count++;
}
direction=4;
}
else{
i--;
j++;
while(i>=0 && !used[i][j]){
list.add(matrix[i][j]);
//System.out.print(matrix[i][j]+" ");
used[i][j]=true;
i--;
count++;
}
direction=1;
}
}
return list;
}
}
Solution 2: 就是我的方法的精简版
class Solution {
public List < Integer > spiralOrder(int[][] matrix) {
List ans = new ArrayList();
if (matrix.length == 0)
return ans;
int r1 = 0, r2 = matrix.length - 1;
int c1 = 0, c2 = matrix[0].length - 1;
while (r1 <= r2 && c1 <= c2) {
for (int c = c1; c <= c2; c++) ans.add(matrix[r1][c]);
for (int r = r1 + 1; r <= r2; r++) ans.add(matrix[r][c2]);
if (r1 < r2 && c1 < c2) {
for (int c = c2 - 1; c > c1; c--) ans.add(matrix[r2][c]);
for (int r = r2; r > r1; r--) ans.add(matrix[r][c1]);
}
r1++;
r2--;
c1++;
c2--;
}
return ans;
}
}
Solution 3:标答给的还挺新颖的方法
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list=new ArrayList<>();
if(matrix.length==0)return list;
int r1=0;
int r2=matrix.length-1;
int c1=0;
int c2=matrix[0].length-1;
while(r1<=r2&&c1<=c2){
for(int i=c1;i<=c2;i++) list.add(matrix[r1][i]);
for(int i=r1+1;i<=r2;i++) list.add(matrix[i][c2]);
for(int i=c2-1;i>=c1+1;i--) list.add(matrix[r2][i]);
for(int i=r2;i>=r1+1;i--)list.add(matrix[i][c1]);
r2--;
r1++;
c2--;
c1++;
}
return list;
}
}