2017/3/30 13:01:59
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5].
典型的螺旋矩阵问题,需要注意一些细节。比如空矩阵;避免角的重复输出。
版本1:撞墙换向(初始定义三个哨兵即可) 3ms O(m*n)
在矩阵外圈包围一层”墙“,由于该输入包含负数,因此设置一个特殊数字,这里设置1<<31。
四个方向依次交替,若前方是墙,则换向,若不是墙,则向前一步并输出值。
结束条件是输出值的个数等于矩阵的大小。代码如下:
public class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<Integer>();
int count = 0;
int M = matrix.length ;
if( M == 0 ) return list;
int N = matrix[0].length;
int inf = 1<<31;
int[][] byarr = new int[M+1][N+2];
byarr[0][N+1] = inf;
byarr[M][N] = inf;
byarr[M-1][0] = inf;
for( int i=0;i<M;i++)
for( int j=1;j<N+1;j++ )
byarr[i][j] = matrix[i][j-1];
int i = 0 , j = 0 , flag = 1;
while( count < M*N ){
switch( flag % 4 ){
case 1:
if (byarr[i][j+1]==inf)
flag++;
else{
list.add( byarr[i][++j] ) ;
byarr[i][j] = inf;
count++;
}
break;
case 2:
if (byarr[i+1][j]==inf)
flag++;
else{
list.add( byarr[++i][j] );
byarr[i][j] = inf;
count++;
}
break;
case 3:
if (byarr[i][j-1]==inf)
flag++;
else{
list.add( byarr[i][--j] );
byarr[i][j] = inf;
count++;
}
break;
case 0:
if (byarr[i-1][j]==inf)
flag++;
else{
list.add( byarr[--i][j] );
byarr[i][j] = inf;
count++;
}
break;
}
}
return list;
}
}
版本2:其实最外围设置三个哨兵就可以,没必要加一圈墙;另外没必要重新复制数组,只需要在判断条件那里加一个哨兵判断(仅最外围用到)。
public class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<Integer>();
int count = 0;
int M = matrix.length ;
if( M == 0 ) return list;
int N = matrix[0].length;
int inf = 1<<31;
int Gu_1 = N , Gu_2 = M , Gu_3 = -1;//外围哨兵
int i = 0 , j = -1 , flag = 1;
while( count < M*N ){
switch( flag % 4 ){
case 1:
if (j+1 == Gu_1 || matrix[i][j+1]==inf )
flag++;
else{
list.add( matrix[i][++j] ) ;
matrix[i][j] = inf;
count++;
}
break;
case 2:
if (i+1 == Gu_2 || matrix[i+1][j]==inf )
flag++;
else{
list.add( matrix[++i][j] );
matrix[i][j] = inf;
count++;
}
break;
case 3:
if (j-1 == Gu_3 || matrix[i][j-1]==inf)
flag++;
else{
list.add( matrix[i][--j] );
matrix[i][j] = inf;
count++;
}
break;
case 0:
if (matrix[i-1][j]==inf)
flag++;
else{
list.add( matrix[--i][j] );
matrix[i][j] = inf;
count++;
}
break;
}
}
return list;
}
}