• 【LeetCode】54. 螺旋矩阵(Java代码)


    【LeetCode】54. 螺旋矩阵(Java代码)

    来源:力扣(LeetCode)
    题目链接:https://leetcode.cn/problems/spiral-matrix
    难度:中等

    给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

    示例 1:

    img

    输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
    输出:[1,2,3,6,9,8,7,4,5]
    
    • 1
    • 2

    示例 2:

    img

    输入:matrix = [[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
    • 2

    提示:

    • m == matrix.length

    • n == matrix[i].length

    • 1 <= m, n <= 10

    • -100 <= matrix[i][j] <= 100

    题解

    题解思路来源:代码随想录

    这题和59. 螺旋矩阵 II差不多,但是因为行和列不同变得更复杂一些。

    相对于59. 螺旋矩阵 II而言,有些改变:

    1. 循环的次数等于行和列中的最小值除以2

    2. 当行和列中的最小值是奇数,则会有没有遍历到的位置

      1. 如果行数大于列数,则会产生中间列没有遍历

      在这里插入图片描述

      1. 如果列数大于等于行数,则会产生中间行没有遍历

        在这里插入图片描述
        在这里插入图片描述

      2. 中间行或中间列的位置mid = 行和列中的最小值除以二的值

      3. 中间行的最大下标的下一位为mid + 列数 - 行数 + 1

      4. 中间列的最大下标的下一位为mid + 行数 - 列数 + 1

    3. 从上到下列的终止条件是小于列数 - 停止下标(offSet)

    4. 从左到右遍历行的终止条件是小于行数 - 停止下标(offSet)

    相同的地方是:

    1. 从右向左遍历行和从下向上遍历列的终止条件都是大于遍历起点start
    2. 每次遍历完start++,offSet++

    代码

    class Solution {
        public List<Integer> spiralOrder(int[][] matrix) {
            //存放数组的数
            List<Integer> ans = new ArrayList<>();
            //列数
            int columns = matrix[0].length;
            //行数
            int rows = matrix.length;
            //遍历起点
            int start = 0;
            //循环的次数 行数和列数中的最小值除以二
            int loop = Math.min(rows,columns) / 2;
            //未遍历的中间列(行)的列(行)下标
            int mid = loop;
            //终止条件
            int offSet = 1;
            int i,j;
            while(loop-- > 0) {
                //初始化起点
                i = j = start;
                
                //从左往右
                for(; j < columns - offSet; j++)
                    ans.add(matrix[i][j]);
    
                //从上往下
                for(; i < rows - offSet; i++)
                    ans.add(matrix[i][j]);
    
                //从右往左
                for(; j > start; j--)
                    ans.add(matrix[i][j]);
                
                //从下往上
                for(; i > start; i--)
                    ans.add(matrix[i][j]);
    
                //每循环一次 改变起点位置
                start++;
                //终止条件改变
                offSet++;
            }
    
            //如果行和列中的最小值是奇数 则会产生中间行或者中间列没有遍历
            if(Math.min(rows,columns) % 2 != 0) {
                //行大于列则产生中间列
                if(rows > columns) {
                    //中间列的行的最大下标的下一位的下标为mid + rows - columns + 1
                    for(int k = mid; k < mid + rows - columns + 1; k++) {
                        ans.add(matrix[k][mid]);
                    }
                }else {//列大于等于行则产生中间行
                    //中间行的列的最大下标的下一位的下标为mid + columns - rows + 1
                    for(int k = mid; k < mid + columns - rows + 1; k++) {
                        ans.add(matrix[mid][k]);
                    }
                }
            }
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
  • 相关阅读:
    JVM基础(4)- JMM:java内存模型与线程安全
    【数据结构】排序(1)
    C-内存函数(大量图解,函数实现)
    html拖动滚动
    zabbix的安装配置,邮件告警,钉钉告警
    Python安装教程
    requests库中r.content 与 r.read() 的使用方式
    hookZz,Dobby,xHook,consoleDebugger
    携程“919旅行囤货划算节”两年,已成行业超级IP
    【数据库原理及应用】——事务并发控制和恢复技术(学习笔记)
  • 原文地址:https://blog.csdn.net/GoddamnCode/article/details/126444191