Leetcode 54. 螺旋矩阵 java

给定一个包含 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]

 


/*
分析: 本题采用自动运行贪吃蛇的思路,让其采用顺时针的方向前进
先定义一个和目标矩阵一样大小的boolean类型矩阵 初始化全为false
然后按照固定的方向顺序每遍历一个就使其置1 ,相当于形成新边界
本思路借鉴网上一位大神,原地址https://www.2cto.com/kf/201507/418663.html
*/
class Solution {
    public List spiralOrder(int[][] matrix) {
      
        List result = new ArrayList();
        int i = 0 , j =0 ; 
        int  row ,column ;
        if(matrix.length == 0)
        {
            return result ;
        }
        
        row = matrix.length ;
        column = matrix[0].length ;
        
        boolean[][] a = new boolean[row][column] ;
        
        int direct = 0 ; //遍历的方向 0 ,1 ,2,3分别表示右 下 左 上 方向
            
        while(i>=0&&i=0)
        {
                if(a[i][j])
                {
                    break ; // 遍历完跳出循环
                }
            result.add(matrix[i][j]) ;
            a[i][j] = true ;

            switch(direct)
                
            {
                case 0 :  
                if(j==column-1||a[i][j+1])
                {
                    i++;//如果向右走到头,就向下走
                    direct=1 ; //改变方向方向
                }
                 else
                     j++;//向右走
                     break ;
                case 1 :  
                    if(i == row-1 ||a[i+1][j])
                    {
                         j--;//如果向下走到头就向左走
                         direct=2 ; //改变方向
                    }
                    else
                         i++ ; //向下走
                         break ;
                case 2 :
                    if(j==0||a[i][j-1])
                    {
                        i-- ;//如果向左走到头就向上走
                        direct=3 ;
                    }
                    else
                        j-- ;  //向左走
                        break ;
                case 3 :
                    if(i==0||a[i-1][j])
                    {
                        j++ ; //如果向上走到头就右走
                        direct=0 ;
                    } 
                    else
                        i--;  //向上走
                        break ;
            }     
        }  
        return result ;     
    }
}

 

你可能感兴趣的:(LeetCode)