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

news/2025/1/7 21:20:19/

目录

    • 前言
    • 算法题(LeetCode刷题59螺旋矩阵II)—(保姆级别讲解)
      • 分析题目:
      • 算法思想(重要)
      • 螺旋矩阵II代码:
    • 结束语

前言

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

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

力扣题目链接

在这里插入图片描述

分析题目:

  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; 

在这里插入图片描述

 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; 

在这里插入图片描述
这里count = 1 相当于第一个数为1,一次递增即可。

int offset = 1; 

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

在这里插入图片描述

while (loop --) 

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

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

在这里插入图片描述

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

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

在这里插入图片描述

初始化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为奇数的话,需要单独给矩阵最中间的位置赋值

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!


http://www.ppmy.cn/news/350010.html

相关文章

【TA 100】3.1 模板测试和深度测试

一、开始前&#xff0c;先看一下举例来理解 1.引例 ● 左图为颜色缓冲区中的一张图&#xff0c;在模板缓冲区中我们会给这张图的每一个片元分配一个0-255的数字&#xff08;8位&#xff0c;默认为0&#xff09; ● 中、右图可以看到&#xff0c;我们修改了一些0为1&#xff0c…

网吧服务器是起什么作用的,网吧服务器的用途是什么?

对于服务器来说&#xff0c;在网络之中占据着很重要的作用&#xff0c;主要就是提供服务&#xff0c;可以让计算机更好运行起来。如果想要达到更好的效果&#xff0c;服务器就要有一定的容量&#xff0c;在很短的时间内响应起来&#xff0c;避免造成更多的麻烦。下面就来看看&a…

网吧管理员技术资料-转的

引自&#xff1a; lauph的博客 声明&#xff1a;近期发现网络流传叫“可胜任任何一间网吧技术主管的绝招”的文章&#xff0c;多谢转载并预美名&#xff0c;此文章是本人在业余时间为一间深圳电脑公司所准备提供网吧网管技术资问答的文章&#xff0c;文章资料会不定期更新请留意…

可以胜任网吧技术主管的绝招

先说明一下&#xff0c;本文有部分内容转自网络&#xff0c;大半是自已的经历之说。。 偶不保证以下说文100%合用与你&#xff0c;但只要你做到以下这些&#xff0c;一定可以如题所写. 各中原由以后再说&#xff0c;打字真的很累......... 以下内容通用于网吧&#xff0c;网吧…

网吧的反扑归真..

不知不觉.已经到了2008了.转眼就要到2009了.. 记得2005年.MAX破解迅闪F8的3.1后刮起了一场网吧游戏更新的革命 --> 对比更新&#xff01; 在那时候足足领先和稳定了接近一年时间&#xff0e;&#xff0e;一直到2006年末。。冰点&#xff0b;迅闪 构造了当时网吧的最完美…

可胜任任何网吧技术主管的绝招

以下内容通用于网吧&#xff0c;网吧技术能在下面的问题启发充电&#xff0c;其实网吧就是这个样。凡事不要钻牛角尖&#xff0c;何不用最快的方式去解决问题&#xff0c;面对的问题不是一个&#xff0c;也不是两个&#xff0c;学到的是自已的&#xff0c;花的是在网吧&#xf…

从防火墙到入侵检测:了解您的网络防御层级

在如今高度互联的数字世界中&#xff0c;网络安全成为了企业和个人面临的重要挑战之一。为了保护机密信息、维护业务连续性和保护用户隐私&#xff0c;建立有效的网络防御层级是至关重要的。本文将介绍网络防御的主要层级&#xff0c;重点关注防火墙和入侵检测系统&#xff0c;…

2010年史上最简单的做母盘教程

2010年史上最简单的做母盘教程 辛苦了两个小时才把教程写完....写得不好大家多多包涵 其实做母盘是一件十分简单的事&#xff0c;只要大家敢去试就能成功的&#xff0c;这教程只给小白看的&#xff0c;老鸟路过指点一下。 本人是珠海信佑代理公司技术员。。大家多指点&#xff…