ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

54. 螺旋矩阵

2019-10-26 12:52:47  阅读:209  来源: 互联网

标签:matrix 螺旋 int 54 矩阵 list start length station


 

 

 

题目描述:

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

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

 

标签:matrix,螺旋,int,54,矩阵,list,start,length,station
来源: https://www.cnblogs.com/mayang2465/p/11737412.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有