zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
     
  • 相关阅读:
    领域驱动设计概念(Domain-driven Design), Flower(响应式微服务框架)
    主流RPC框架通讯协议实现原理与源码解析
    响应式微服务框架Flower——快速上手
    netty源码-server端绑定端口流程
    ubuntu 20.04版本更新软件源为国内源(清华、网易、阿里云等等)
    ubuntu20.04源码安装nginx
    docker环境下Java获取cpu核心数不准确,实际上是宿主机的cpu核心数
    利用docker快速搭建创建开发环境
    mac配置python环境
    Apache Maven-创建项目
  • 原文地址:https://www.cnblogs.com/flyfatty/p/6646090.html
Copyright © 2011-2022 走看看