给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
按照正常的思维就是每次都边界了判断下转弯,但代码看起来很挫,答案里简化了写法,用一个数组来标识方向。
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list=new ArrayList();
int r=matrix.length;
if(r<=0) return list;
int c=matrix[0].length;
boolean[][] mark=new boolean[r][c];
int op=0;
int i=0;
int j=0;
for(int count=0;count<r*c;){
list.add(matrix[i][j]);
mark[i][j]=true;
count++;
int i0=i;
int j0=j;
if(op==0) j0++;
else if(op==1) i0++;
else if(op==2) j0--;
else if(op==3) i0--;
if(i0>=0 && i0<r && j0>=0 && j0<c && !mark[i0][j0]){
i=i0;
j=j0;
}else{
op++;
if(op==4){
op=0;
}
i0=i;
j0=j;
if(op==0) j0++;
else if(op==1) i0++;
else if(op==2) j0--;
else if(op==3) i0--;
i=i0;
j=j0;
}
}
return list;
}
还有一种,按层来遍历,每一层都是左上角开始,注意判断index=c-index-1或index=r-index-1的重复情况
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list=new ArrayList();
int r=matrix.length;
if(r<=0) return list;
int c=matrix[0].length;
int max=Math.min((r+1)/2,(c+1)/2);
for(int index=0;index<max;index++){
for(int j=index;j<=c-index-1;j++) list.add(matrix[index][j]);
for(int i=index+1;i<=r-index-1;i++) list.add(matrix[i][c-index-1]);
for(int j=c-index-2;j>index && r-index-1>index;j--) list.add(matrix[r-index-1][j]);
for(int i=r-index-1;i>index && c-index-1>index;i--) list.add(matrix[i][index]);
}
return list;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。