• 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));
            }
        }
    }
  • 相关阅读:
    MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
    最简单的mybatis增删改查样例
    JAVA地址栏重写很详细
    rapid-generator JAVA代码生成器
    PouchDB:可随时同步的开源JavaScript数据库
    写给java web一年左右工作经验的人
    使用 XMLBeans 进行编程
    使用Spring JMS轻松实现异步消息传递
    Spring JMSTemplate 与 JMS 原生API比较
    浅析深究什么是中间件
  • 原文地址:https://www.cnblogs.com/mayang2465/p/11737412.html
Copyright © 2020-2023  润新知