54. 螺旋矩阵

 

 

 

题目描述:

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

解法1:

  新创建一个与矩阵同大小的Boolean矩阵,将已经走过的位置置true,然后拐弯的时候判断一下是不是已经走过了或者是不是超过边界,如果走过了(根据boolean矩阵值是否为空)或超出边界就计算一下新的方向:

package array;

import java.util.ArrayList;
import java.util.List;

public class L54_2 {
    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        //下方用到matrix[0],所以需要防止出现空值情况
        if(matrix.length == 0){return list;}
        //用于指示下一个数据的位置
        int[] dx ={0, 1, 0, -1},dy = {1, 0, -1, 0};
        int station_x = 0, station_y = 0 , station_xnew = 0, station_ynew = 0,
        dirt_xy = 0,index = 0;
        Boolean[][] matrix_boolean = new Boolean[matrix.length][matrix[0].length];
        //遍历矩阵所有数据的长度
        while(index < matrix.length*matrix[0].length){
            list.add(matrix[station_x][station_y]);
            matrix_boolean[station_x][station_y] = true;
            //station_xnew,station_ynew用于验证该位置的数据合法性
            station_xnew = station_x + dx[dirt_xy];station_ynew = station_y + dy[dirt_xy];
            if( station_xnew >=0 &&  station_xnew <= matrix.length-1 && station_ynew >=0 &&  station_ynew <=matrix[0].length-1
                    && (matrix_boolean[station_xnew][station_ynew] == null)){
                matrix_boolean[station_xnew][station_ynew] = false;
                station_x = station_xnew;station_y = station_ynew;
            }else{
                dirt_xy = (++ dirt_xy) % 4;
                station_x += dx[dirt_xy];station_y += dy[dirt_xy];
            }
            index ++;
        }
        return list;
    }
    public static void main(String[] args) {
        int[][] matrix = {{1,2,3},{4,5,6},{7,8,9}};
        List<Integer> ll = spiralOrder(matrix);
        for (int i =0;i<ll.size();i++){
            System.out.println(ll.get(i));
        }
    }
}

解法2:

相比于上一个方法更好理解,主要就是从外圈逐渐向里圈逐渐遍历

package array;

import java.util.ArrayList;
import java.util.List;

public class L54 {
    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        if(matrix.length == 0){return list;}
        //遍历的圈数,是长与宽之间最小值决定的
        int cir_Time = Math.min(matrix.length,matrix[0].length);
        int start = 0;
        while(start <= (cir_Time-1)/2){
            for(int index = start;index <= matrix[0].length-1-start;index++) list.add(matrix[start][index]);

            for(int index = start+ 1;index < matrix.length-1-start;index++)  list.add(matrix[index][matrix[0].length-1-start]);

            if(start != matrix.length-1-start){
                for(int index = matrix[0].length-1-start;index >= start;index--) list.add(matrix[matrix.length-1-start][index]);
            }
            if(start != matrix[0].length-1-start){
                for(int index = matrix.length-start-2;index > start;index--) list.add(matrix[index][start]);
            }
            start++;
        }
        return list;
    }
    public static void main(String[] args) {
        int[][] matrix = {{1,2},{3,4}};
        List<Integer> ll = spiralOrder(matrix);
        for (int i =0;i<ll.size();i++){
            System.out.println(ll.get(i));
        }
    }
}

 

posted @ 2019-10-26 12:44  努力学习~~~  阅读(181)  评论(0编辑  收藏  举报