看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20

这篇具有很好参考价值的文章主要介绍了看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!!

算法题(LeetCode刷题59螺旋矩阵II)—(保姆级别讲解)

力扣题目链接

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20

分析题目:

  1. 元素按照顺时针顺序螺旋排列正方形矩阵
  2. 正方形:就需要保证每一边的长度不变
  3. 遍历过程需要保证循环不变量原则

算法思想(重要)

  1. 什么是循环不变量原则?
    在之前的二分查找中我们就已经运用了循环不变量原则,在这里再提一下:由于在本篇中我们要遍历螺旋矩阵,也就意味着同样一个点不需要重复遍历很多次,所以为了避免这个情况,我们将遍历每条边的规则确定下来,即在本篇中使用左闭右开的规则,这样就可以成功解决问题。
  2. 在本篇中我们需要给定一个正整数n,那么这个正整数有什么作用呢?
    正整数n一共分为两种情况,分别是奇数和偶数。这里举个例子,假设n为奇数,即n = 3,那么最终输出结果应该为[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ],所以我们需要通过这个参数n来确定我们一共需要循环遍历几圈,只不过每圈遍历的规则是一样的。在本篇中循环几圈可以通过n/2确定。
  3. 假设我们现在在循环遍历第一圈,即可以将完整的一圈分为四种情况,分别是上,右,下,左。以上为例,由于我们采取左闭右开的规则,所以最后一个节点下一次遍历开始节点,以此类推。

螺旋矩阵II代码:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0)); 
        int startx = 0, starty = 0; 
        int loop = n / 2; 
        int mid = n / 2; 
        int count = 1; 
        int offset = 1; 
        int i,j;
        while (loop --) {
            i = startx;
            j = starty;

            for (j = starty; j < n - offset; j++) {
                res[startx][j] = count++;
            }
            
            for (i = startx; i < n - offset; i++) {
                res[i][j] = count++;
            }
            
            for (; j > starty; j--) {
                res[i][j] = count++;
            }
            
            for (; i > startx; i--) {
                res[i][j] = count++;
            }

            startx++;
            starty++;

            offset += 1;
        }

        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};
时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
空间复杂度 O(1)

我们还是老样子,对代码逐句进行分析:

 vector<vector<int>> res(n, vector<int>(n, 0)); 

//使用vector定义一个二维数组

int startx = 0, starty = 0; 

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20

 int loop = n / 2; 

//相当于是确定了遍历螺旋矩阵需要循环的圈数。例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理。假设n为偶数4,那么loop = 2就循环两圈,也就相当于矩阵没有需要单独处理的中间值。

int mid = n / 2; 

//相当于是n为奇数就会遗留出中间值的情况,所以mid相当于是矩阵中间的位置,例如:n为3, 中间的位置就是(1,1)n为5,中间位置为(2, 2)

int count = 1; 

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20
这里count = 1 相当于第一个数为1,一次递增即可。

int offset = 1; 

// 需要控制每一条边遍历的长度,每次循环右边界收缩一位

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20

while (loop --) 

//前面已经提过总共循环的圈数。

for (j = starty; j < n - offset; j++) {
                res[startx][j] = count++;
            }

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20

//初始化offest1,由于遵循左闭右开的原则,所以是j < n - offset,即第一圈为j < n - 1,如上图所示为j的范围为[0,3)

for (i = startx; i < n - offset; i++) {
                res[i][j] = count++;
            }

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20

初始化offest1,由于遵循左闭右开的原则,所以是i < n - offset,即第一圈为i < n - 1,如上图所示为i的范围为[0,3),并且此时j的值已经为n - offest,所以直接为j即可。

for (; j > starty; j--) {
                res[i][j] = count++;
            }

//由于此时j的值已经为最大值,即n - offset,所以就没必要对j进行初始化。并且此时starty0

 for (; i > startx; i--) {
                res[i][j] = count++;
            }

//由于此时i的值已经为最大值,即n - offset,所以就没必要对i进行初始化。并且此时startx0

 startx++;
 starty++;

//第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0)第二圈起始位置是(1, 1)

 offset += 1;

//offset 控制每一圈里每一条边遍历的长度

if (n % 2) {
            res[mid][mid] = count;
        }

//如果n为奇数的话,需要单独给矩阵最中间的位置赋值

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!文章来源地址https://www.toymoban.com/news/detail-447367.html

到了这里,关于看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题59螺旋矩阵II) 2023.4.20的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题203.707.206翻转链表) 2023.4.21

    看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题203.707.206翻转链表) 2023.4.21

    本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!! 力扣题目链接 关于这个算法思想,我在之

    2024年02月04日
    浏览(9)
  • 看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题704、35、34数组二分查找) 2023.4.17

    看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题704、35、34数组二分查找) 2023.4.17

    本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!! 数组是由n(n=1)个 相同类型 的数据元素

    2024年02月05日
    浏览(15)
  • 看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题142环形链表II) 2023.4.24

    看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题142环形链表II) 2023.4.24

    本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!! 力扣题目链接 分析题目: 其实本题目中主

    2024年02月05日
    浏览(10)
  • 看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题242有效的字母异位词) 2023.4.25

    看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题242有效的字母异位词) 2023.4.25

    本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!! 力扣题目链接 分析题目: 什么叫做字母异

    2024年02月06日
    浏览(13)
  • 看完这篇文章你就彻底懂啦{保姆级讲解}-----(I.MX6U驱动UART串口通信) 2023.5.20

    看完这篇文章你就彻底懂啦{保姆级讲解}-----(I.MX6U驱动UART串口通信) 2023.5.20

    串口是我们在开发过程中最常用到的外设,所以我们必须掌握。 串口驱动初始化部分 好!按照老样子,接下来开始详细讲解每行代码的用处,以及为什么这样写! 串口驱动初始化部分讲解开始: //将IO功能设置为UART1_RXD和UART1_TXD。 //配置UART1_TX_DATA、UART1_RX_DATA的IO属性。 先关

    2024年02月05日
    浏览(8)
  • ai绘画如何使用?看完这篇文章你就知道了

    ai绘画如何使用?看完这篇文章你就知道了

    对于艺术家和创作者来说,AI绘画可以作为一种实用的工具,提供灵感和创意的源泉。它可以分析和学习大量的艺术作品,从中汲取元素和风格,并以独特的方式重新组合和表达。这使得艺术家能够更快速地探索和实验不同的艺术风格,从而推动他们的创造力和艺术表达的边

    2024年02月09日
    浏览(9)
  • ai绘画生成方法有哪些?看完这篇文章你就知道了

    ai绘画生成方法有哪些?看完这篇文章你就知道了

    近年来,随着人工智能技术的不断发展和普及,AI 绘画作为一种新兴的艺术创作方式也逐渐被人们所认知。与传统绘画相比,AI 绘画可以通过计算机算法自动生成,具有高效、便捷的特点,同时也能够更好地满足一些特定场景的需求。 在过去,数字艺术家需要通过绘制、建模

    2024年02月15日
    浏览(14)
  • 中缀表达式转后缀表达式看完这一篇文章你就懂了

    一、什么是中缀表达式 二、什么是后缀表达式 三、后缀转中缀具体思路 四、代码实现 中缀表达式就是我们常用的算术表达方式,例如 (12+34)*5 ,运算符在两个数的中间,但是对于中缀表达式来说括号和加减乘除使得问题对于计算机非常复杂,为了有效的处理他们,波兰逻辑

    2024年02月08日
    浏览(9)
  • 怎么用ai绘画二次元拍同款?看完这篇文章你就懂了

    怎么用ai绘画二次元拍同款?看完这篇文章你就懂了

    在我们的二次元世界里,每一张优质的插图都能够引发无尽的想象和瞬间的心动。而现如今,随着人工智能技术的飞速发展,ai绘画已经成为一个备受瞩目的领域。在使用ai绘画生成二次元作品时,ai绘画二次元描述词就显得相当重要。那么,究竟ai绘画二次元描述词怎么写呢

    2024年02月16日
    浏览(13)
  • 你真的学懂if语句了嘛,看完这篇文章你一定会让你有所收获,彻底玩转if语句!

    你真的学懂if语句了嘛,看完这篇文章你一定会让你有所收获,彻底玩转if语句!

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位宝子们大家好啊,相信大家都多多少少了解过if语句吧,但是你真的有了解过,所有if语句的细节吗?学完这篇文章你将知道if语句的所有知识

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包