leetcode【数组—中等】59.螺旋矩阵

文章目录

  • 前言
  • 题目
  • 题解
  • 参考资料

前言

哈喽,我是长路,目前刚刚大三,方向是后端也偶尔捣鼓下前端,现在的主语言是Java。之前一大段时间都是在学习web开发的一些技术,就很久没有进行类似于数据结构、算法之类的学习与刷题,打算这段时间拾起来好好学一学、搞一搞。

这段时间也是机缘巧合看到草帽路飞的博客,加了自学群,正巧看到博主组织在群里组织了leetcode刷题打卡活动,我也就参与进来,为期一个月,打算坚持每天都花一些时间做一些题目,并通过博客的方式来进行记录。



题目

题目来源leetcode

leetcode地址:59. 螺旋矩阵 II,难度:中等。

题目描述(摘自leetcode):

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:
输入:n = 1
输出:[[1]]
 
提示:
1 <= n <= 20

本地调试代码:

class Solution {
     
    //业务代码
    public int[][] generateMatrix(int n) {
     
        ...
    }

    public static void main(String[] args) {
     
        int n = 4;//设置边长度
        printMatrix(n);
    }

    public static void printMatrix(int n){
     
        Solution solution = new Solution();
        int m = n * n;
        int numLen = 0;
        while (m > 0) {
     
            m = m / 10;
            numLen++;
        }
        numLen += 2;//每个数字之间空两个
        int[][] ints = solution.generateMatrix(n);
        for (int i = 0; i < ints.length; i++) {
     
            for (int j = 0; j < ints[i].length; j++) {
     
                System.out.printf("%-" + numLen + "d", ints[i][j]); //numLen表示长度,-表示左对齐。例如:%-4d => 宽度为4,左对齐
            }
            System.out.println();
        }
    }
}


题解

这是一道逻辑题,花费了我一个多小时解出来,关键就是需要你找到其中的规律!

思路

刚开始实在没有头绪,就去看了大佬的一个题解思路,看到下面这张图之后就开始撸代码了,我觉得最核心的就是下面这个图,其他主要就是你要找一些规律,例如有边长n对应有多少圈;在哪一圈上下左右每次需要填充的数量;最里边填充一个数字的情况…

leetcode【数组—中等】59.螺旋矩阵_第1张图片

  • 图片取自:代码随想录—螺旋矩阵

代码

public int[][] generateMatrix(int n) {
     
    int[][] matrixArr = new int[n][n];
    if (n == 1) {
     
        matrixArr[0][0] = 1;
        return matrixArr;
    }
    //填充的数
    int num = 1;
    //圈数
    int outCircleNums = n % 2 == 1 ? n / 2 + 1 : n / 2;
    //每层(上下左右)要填充的对应数量。例如上图3*3,上下左右方向都要填充2个
    int curTire = 0;
    //圈数遍历
    for (int i = 0; i < outCircleNums; i++) {
     
        //求每层(上下左右)要填充的对应数量
        if (i == 0) {
     
            curTire = n - 1;//最外圈只要-1即可
        } else {
     
            curTire = curTire - 2;//里面的每一圈都要-2
        }

        //最内圈只有一个数的情况
        if (i == outCircleNums - 1 && n % 2 == 1) {
     
            matrixArr[i][i] = num;
            break;
        }

        //绘制正方形上层
        for (int j = i; j < i + curTire; j++) {
     
            matrixArr[i][j] = num++;
        }

        //绘制正方形右边
        for (int j = i; j < i + curTire; j++) {
     
            matrixArr[j][curTire + i] = num++;
        }

        //绘制正方形下边
        for (int j = i + curTire; j > i; j--) {
     
            matrixArr[curTire + i][j] = num++;
        }

        //绘制正方形左边
        for (int j = i + curTire; j > i; j--) {
     
            matrixArr[j][i] = num++;
        }
    }
    return matrixArr;
}

leetcode【数组—中等】59.螺旋矩阵_第2张图片

本地调试效果图:

leetcode【数组—中等】59.螺旋矩阵_第3张图片

leetcode【数组—中等】59.螺旋矩阵_第4张图片



参考资料

[1]. leetcode题解

[2]. 代码随想录—螺旋矩阵



我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接

你可能感兴趣的:(#,leetcode,leetcode,算法)