软件编程
位置:首页>> 软件编程>> java编程>> Java实现LeetCode(54.螺旋矩阵)

Java实现LeetCode(54.螺旋矩阵)

作者:莫少侠9527  发布时间:2023-01-26 20:54:00 

标签:Java,LeetCode,螺旋矩阵

LeetCode54. 螺旋矩阵 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]

思路

找出每个点的坐标,每个点每次延顺时针分别为右、下、左、上四个方向走一个位置,维护一个方向变量,不同方向时做相应的边界判断。每次遇到边界,必定改变方向,缩短原边界大小。

解法


public List<Integer> spiralOrder(int[][] matrix) {
       ArrayList<Integer> order = new ArrayList<>();

if (matrix.length == 0 || matrix[0].length == 0) {
           return order;
       }
       int m = matrix.length;
       int n = matrix[0].length;
       int len = m * n;
       int row = 0;
       int col = 0;
       int leftMin = 0;
       //每次走上下左右四个方向,一次只走一格
       //注意点,因为是从(1,1)开始走的,所以上界最小row是第二行1
       int topMin = 1;
       //初始方向值
       int k = 0;
       int[][] dir = {
               {1, 0, -1, 0},
               {0, 1, 0, -1}
       };
       for (int i = 0; i < len; i++) {
           order.add(matrix[row][col]);
           col += dir[0][k % 4];
           row += dir[1][k % 4];
           switch (k % 4) {
               case 0:
                   //右
                   if (col > n - 1) {
                       col = n - 1;
                       row++;
                       k++;
                       n--;
                   }
                   break;
               case 1:
                   //下
                   if (row > m - 1) {
                       row = m - 1;
                       col--;
                       k++;
                       m--;
                   }
                   break;
               case 2:
                   //左
                   if (col < leftMin) {
                       col = leftMin;
                       leftMin++;
                       row--;
                       k++;
                   }
                   break;
               case 3:
                   //上
                   if (row < topMin) {
                       row = topMin;

topMin++;

col++;
                       k++;
                   }
                   break;
           }

}
       return order;
   }

结果

2ms 战胜99.74%

来源:https://blog.csdn.net/qq_29777823/article/details/82357113

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com