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;
    }
}

 

 
posted @ 2017-03-30 14:32  会飞的胖子  阅读(105)  评论(0编辑  收藏  举报