54. Spiral Matrix【数组】
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; } }