IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode【数组—中等】59.螺旋矩阵 -> 正文阅读

[数据结构与算法]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对应有多少圈;在哪一圈上下左右每次需要填充的数量;最里边填充一个数字的情况…

image-20211012223030649

代码

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

image-20211012222601871

本地调试效果图:

image-20211012223102589

image-20211012223130186



参考资料

[1]. leetcode题解

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



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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:53:24  更:2021-10-16 19:53:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:35:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码