【LeetCode第59题】长舒一口气,终于学会了这苦涩难懂的 螺旋矩阵II

  • 👏作者简介:大家好,我是卷心菜~~,在校大二学生一枚,Java领域新星创作者。
  • 📝个人主页:卷心菜的CSDN博客
  • 📕系列专栏:本文写在数据结构与算法专栏:数据结构与算法
  • 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
  • 🌻格言:向日葵向阳生长,我也是✨

前言

今天早上在LeetCode上刷数组相关的题目,前面写过的几道题刷的挺舒服的,什么快慢指针、滑动窗口、双指针以及二分查找等等,题解看懂后,自己都可以敲一遍代码实现题目的要求。可就是在今天,遇到了力扣上螺旋矩阵 II这道题,真的是很烦,虽然没什么数据结构与算法,模拟的是过程,但是却十分的考察对代码的掌握能力,看了好久,把自己的解题思路写在博客上,希望大家喜欢✔

一、题目展示

原题地址:力扣59题:螺旋矩阵II

题目要求:在这里插入图片描述
示例1:
在这里插入图片描述
示例2:
在这里插入图片描述

二、整体思路分析

  • 确定开闭原则:前闭后开
  • 矩阵上行填入值从左到右
  • 矩阵右侧填入值从上到下
  • 矩阵下行填入值从右到左
  • 矩阵左侧填入值从下到上

示意图:
在这里插入图片描述

写的时候,一定要坚持这些原则,不然的话,容易写乱,写糊涂。这道题不像是其它的算法题,它主要考的是模拟过程,没有涉及到什么算法,需要多些,多想。

三、提交代码

class Solution {
    public int[][] generateMatrix(int n) {
  		//模拟矩阵
        int[][] res = new int[n][n];

        //这是每一圈的开始位置
        int startX = 0;
        int startY = 0;

        //这是根据 n来决定圈数,当 n为奇数时,特别讨论
        int loop = n / 2;

        //这是下面 while语句中的成员变量
        int i;
        int j;

        //这是赋值用的1 2 3 4 等等
        int count = 1;

        //这是用来决定开闭原则的偏移量
        int setValue = 1;

        //开始赋值
        while(loop > 0){
            //把每一次遍历的开始,确定好位置
            i = startX;
            j = startY;

            //上行从左到右,前开后闭依次赋值
            for (;j < startY + n - setValue;j++){
                res[startX][j] = count++;
            }

            //右侧从上到下,前开后闭依次赋值
            //注意,这里的 j的值已经发生了改变,它是第一个for循环后的结果
            for (;i < startX + n - setValue;i++){
                res[i][j] = count++;
            }

            //下行从右到左,前开后闭依次赋值
            for (;j > startY;j-- ){
                res[i][j] = count++;
            }

            //左侧从上到下,前开后闭依次赋值
            for (;i > startX;i--){
                res[i][j] = count++;
            }

            loop--;
            startX++;
            startY++;
            setValue += 2;
        }

		//当n是奇数的时候,就有中间值
        int mid = n / 2;
        //count也可以写成 n * n
        if ( n % 2 == 1) res[mid][mid] = count ;

        return res;
    }
}

四、代码分析

易点分析

  • 用二维数组模拟方阵
  • 当 n是奇数的时候,就会有一个中间值,这个很容易理解,写的时候不要忘记了,我把它放在代码的最后部分
  • startX,startY 代表着每一完成后的起始位置。当n=4时,res[0][0]就是第一圈的起始位置;res[1][1]就是第二圈的起始位置,自己画图一下就可以看明白了

难点分析

  • 偏移量setValue 的确定。因为遵守的是前闭后开的原则,所以第一圈上行从左到右侧时,在最右侧的前一个位置停下来,以n=4为例,即在res[0][2]的位置停下来。
  • setValue += 2 的问题。因为当第一圈结束后,会填满矩阵最左边和最右边的两个位置,为了避免再次出现填充过的位置,所以每一次的偏移量都要加2

总结

这道力扣题主要学习到的是对自己写的代码的掌控力:填充的原则、开闭的原则等等,自己以后肯定会忘得,记得多练习,熟能生巧!!!

  • 38
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一棵卷心菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值