代码随想录--数组--螺旋矩阵题型

news2024/10/7 8:29:34

n等于几,螺旋矩阵最外层行列数就等于几。如n等于3所以最外层一圈的行、列都是3个数字,如左图,n等于4所以最外层的行、列都是4个数字,如右图:

a91621fe30fe4967902719092454c3de.png

 题目要求我们输出(以n=3为例)[[123][894][765]],题目只是给我们一堆数字,我们怎样才能输出题目要输出的结果呢?我们要做的是把这些数字按顺时针螺旋式一个位置一个位置填充进去,然后再返回这个二维数组即可(因为二维数组它的保存顺序就是从第一行从左到右然后再第二行从左到右如此下去的,所以返回这个二维数组就是返回我们想要的[[123][894][765]]。

接下来就是如何顺时针螺旋式填充这个二维数组啦。

http://【一入循环深似海 | LeetCode:59.螺旋矩阵II-哔哩哔哩】 https://b23.tv/vN31TwF

 还记得二分法里一定要坚持的循环不变原则,螺旋矩阵也要坚持循环不变量原则,这个很重要。需要定好矩阵的四个角落怎么分配,我们坚持左闭右开的原则,即下图这样,如第一行左角落包含进去而右角落不包含进去,同理第四列上角落包含进去下角落不包含进去...这样就能保证同一圈的每行每列填充的数量都是一样的,这样代码才不会越写越乱,不然一会左闭右开一会左开右闭一会又左闭右闭,就会越写越乱。

76cc2165d5074754a7f9df7b021aaeb6.jpeg

 套路大致是这样:(以n=4为例)

vector<vector<int>>sums(n,vector<int>(n,0)); //首先定义一个二维数组

startx=0,starty=0; 

 //我们坐标是(i,j),i是上下方向,j是左右方向,然后定义初始的位置即startx,starty(0,0)嘛,从第一行第一个位置开始

offset=1,count=1;  int i,j;

//offset是为了控制每一圈里每一条边遍历的长度,我们后面会用到n-offset,如第一行我们是只要填充第1,2,3个位置,第4个位置我们是不填充的,所以j<n-offset即j<3,因为我们i,j是从0开始的嘛,所以小于3即只填充0,1,2,这3个位置。count是填充进去的数,即用来给矩阵每一个空格赋值的。

int mid=n/2;  //矩阵中间的位置

int loop=n/2; //是循环几圈

while(loop--){  //是循环几圈的,如果n为奇数3即循环1圈即可然后再额外填最中间那个

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

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

for ( ; j>starty ; j--){ sums [i] [j] = count; count++;}  //因为j就是从j开始所以是空;

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

startx++;

starty++;

//如第二圈开始位置就变成(1,1)了,所以每填充完一圈,startx和starty都要++

offset++;

//如第二圈第一行只能填充1个,注意不是4-2=2,所以第二圈每一条边遍历的长度为2,看图就知道第二圈如上行只能填充13,14是留给右行的。那j<n-offset=4-2,不就是0,1两个嘛?因为这时候第二圈j是从1开始了,所以是只有1即一个长度。

}

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

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

return sums;

 

//注意要理解当中间有一个时比如最中间那个5,为什么要在循环外加入sums数组中,而不是在循环里就加上。因为例如n=3,到了第二圈n-offset=3-2=1,而我们有要控制的遍历长度规则就是j要<n-offset=1的且此时j已经为1,1不<1,所以进入不了循环,所以需要在循环外把它额外加入数组sums中。

 

同类型题

①leetcode 59.螺旋矩阵II (就是以这道题为例的)

②leetcode 54.螺旋矩阵

③剑指offer 29.顺时针打印矩阵

 

②③是同一种题,注意此时和59题又有点不一样了。

有哪些不同?最好自己画几个图看看更直观。

第一个不同:循环完圈后长方形的矩形有剩下一行或者一列的情况

59题因为题目给出的是以一个数的平方为矩阵,所以这个矩阵一定是正方形,正方形是不会出现循环圈后中间还剩下一行或者一列的情况,而54,29题有可能是正方形也有可能是长方形,而长方形就有可能出现循环完圈后中间还剩下一行或一列的情况,所以需要注意好循环后补充中间剩下的一行或一列的情况。

第二个不同:循环几圈的判断不同

59题如上面说的,循环n/2圈即可。而54,29不一样,是根据行数和列数其中最小的那个来判断,用最小的那个/2,这才是要循环的圈数。你画几个例子图看看就知道了

 

相同点:

第一,还是遵循循环不变量原则,即每一圈每一条边需要遍历的长度要按照左闭右开的原则,只不过因为59是正方形所以i,j都<n-offset即可;而54,29不一样,有可能是长方形了,就有可能上行需要遍历3个而右行只需遍历2个,所以要根据具体的行数列数具体分析,但是思路是一样的,左闭右开即都把最后一个角落的数给下一个循环遍历,所以是j<m-offset,i<n-offset。

第二,还是循环绕圈的思想通过循环把数获取出来,中间剩下的再在循环外添加,只不过现在多了可能剩下的是一行数或者一列数而已。

 

还有一些要注意的:

怎么判断中间剩下的是一个数还是一行数还是一列数?

当行数和列数其中最小的那个为奇数时,就有剩下的是一行或一列的情况。然后如果行数<列数时剩下的就是一行数,如果行数>列数剩下的就是一列数,注意是谁少就留下谁的,如果相等,则剩下的就是一个数。

然后如果有剩下的一个数一行数或者一列数的情况,就在循环外把它加进数组,因为是一行或一列所以是用for循环把它放进ans数组里。

 

补充一点知识:对于二维数组ass[][],怎么判断它的行数和列数,我是个笨蛋老是搞乱。

ass.size() 指的就是多少行,上下方向的行数

ass[0].size() 指的就是多少列,左右方向的列数

 

leetcode 54:

a40374d0883241d8a3712438331ec2e0.jpeg

 剑指offer29:

8794c9f5fe0e45f3933cfc318f38b451.png

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/403630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL:索引与事物

目录 简单了解索引的底层数据结构 索引的概念&#xff1a; 索引存在的意义&#xff1a; 索引的使用&#xff1a; 索引实现的数据结构 B树 B 树 B 树的特点 B 树的优势 事物 事物的概念 事物的使用 事物的四大特性 并发可能引起的问题 脏读问题 不可重复读 幻读…

未系安全带识别系统 yolo

未系安全带识别系统通过pythonyolo智能视频分析技术&#xff0c;未系安全带识别算法对画面中高空作业人员未系安全带行为进行监测&#xff0c;未系安全带识别算法监测到人员未穿戴安全带时&#xff0c;立即通知后台人员及时处理触发告警。Yolo算法采用一个单独的CNN模型实现end…

算法24:LeetCode_并查集相关算法

目录 题目一&#xff1a;力扣547题&#xff0c;求省份数量 题目二&#xff1a;岛屿数量 题目三&#xff1a;岛屿数量拓展 什么是并查集&#xff0c;举个简单的例子。学生考试通常会以60分为及格分数&#xff0c;我们将60分及以上的人归类为及格学生&#xff0c;而60分以下归…

mysql学习之数据系统概述

☀️马上要成为打工人&#xff0c;这几天把前面的知识都捡了捡&#xff0c;发现自己对关系数据库这块的学习还有所缺失&#xff0c;于是本章开始学习mysql 这里写目录标题1. 数据库系统的发展1.1 人工管理阶段1.2 文件系统阶段1.3 数据库阶段1.4 大数据阶段2 数据库系统的组成2…

扬帆优配|2600亿汽车巨头闪崩近9%,汽车股惊现“冰火两重天”!

今日早盘&#xff0c;A股全体低开震荡调整&#xff0c;首要股指跌逾1%&#xff0c;科创板体现略强&#xff0c;盘中一度直线拉升翻红&#xff0c;两市一度近4200股下跌。 盘面上&#xff0c;轿车服务、信创、半导体等板块相对强势&#xff0c;轿车整车、超导概念、一体压铸、建…

【MySQL】MySQL的索引

目录 介绍 索引的分类 索引的操作-创建索引-单列索引-普通索引 格式 操作 索引的操作-创建索引-单列索引-唯一索引 索引的操作-创建索引-单列索引-主键索引 索引的操作-创建索引-组合索引 索引的操作-全文索引 索引的操作-空间索引 索引的验证 索引的特点 介绍…

Lazada、Allegro、速卖通测评自养号技术(方法解析)

无论是亚马逊、拼多多Temu、shopee、Lazada、wish、速卖通、煤炉、敦煌、雅虎、eBay、TikTok、Newegg、乐天、美客多、阿里国际、沃尔玛、OZON、Joom、Facebook、Coupang、独立站、Cdiscount、Kaufland、DARTY、Allegro、MANO等平台测评自养号对于卖家来说算是一种低成本、高回…

什么?你不知道 ConcurrentHashMap 的 kv 不能为 null?

一、背景 最近设计某个类库时使用了 ConcurrentHashMap 最后遇到了 value 为 null 时报了空指针异常的坑。 本文想探讨下以下几个问题&#xff1a; &#xff08;1&#xff09; Map接口的常见子类的 kv 对 null 的支持情况。 &#xff08;2&#xff09;为什么 ConcurrentHashM…

Ethercat学习-电机调试问题总结

文章目录问题1&#xff1a;初始化不进入OP状态问题2&#xff1a;PDO通讯数据不对主站硬件&#xff1a;STM32F405LAN8720A主站软件&#xff1a;SOEM 问题1&#xff1a;初始化不进入OP状态 现象描述&#xff1a;主站初始化过程中&#xff0c;打印信息显示状态一直在safe-op&…

多态且原理

多态 文章目录多态多态的定义和条件协变&#xff08;父类和子类的返回值类型不同&#xff09;函数隐藏和虚函数重写的比较析构函数的重写关键字final和override抽象类多态的原理单继承和多继承的虚函数表单继承下的虚函数表多继承下的虚函数表多态的定义和条件 定义&#xff1…

Python批量爬取游戏卡牌信息

文章目录前言一、需求二、分析三、处理四、运行结果前言 本系列文章来源于真实的需求本系列文章你来提我来做本系列文章仅供学习参考阅读人群&#xff1a;有Python基础、Scrapy框架基础 一、需求 全站爬取游戏卡牌信息 二、分析 查看网页源代码&#xff0c;图片资源是否存在…

Node.js + MongoDB 搭建博客 -- 登录页面

准备工作 安装Node.js安装express等相关库MongoDB数据库电脑系统&#xff1a;win11 功能分析 搭建一个简单的具有多人注册、登录、发表文章以及登出功能的博客。 设计目标 未登录&#xff1a;主页左侧导航栏显示home、login、register&#xff0c;右侧显示已发表的文章、发…

视觉SLAM14讲第三章习题作业

这是本人的解答&#xff0c;并非官方解答 验证旋转矩阵是正交矩阵 在第44页中&#xff0c;旋转矩阵的引入是这样的&#xff1a; 所以&#xff0c;我们需要验证矩阵 R[e1Te1′e1Te2′e1Te3′e2Te1′e2Te2′e2Te3′e3Te1′e3Te2′e3Te3′]R \begin{bmatrix} e_1^{T}e_1^{}&am…

【Java开发】设计模式 02:工厂模式

1 工厂模式介绍工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使…

Weblogic管理控制台未授权远程命令执行漏洞复现(cve-2020-14882/cve-2020-14883)

目录漏洞描述影响版本漏洞复现权限绕过漏洞远程命令执行声明&#xff1a;本文仅供学习参考&#xff0c;其中涉及的一切资源均来源于网络&#xff0c;请勿用于任何非法行为&#xff0c;否则您将自行承担相应后果&#xff0c;本人不承担任何法律及连带责任。 漏洞描述 Weblogic…

CorelDRAW2023最新版新增功能200多个新模板

CorelDRAW是一款平面矢量绘图排版软件&#xff0c;CorelDRAW运用涵盖企业VI设计&#xff0c;广告设计&#xff0c;包装设计&#xff0c;画册设计&#xff0c;海报、招贴设计&#xff0c;UI界面设计&#xff0c;网页设计&#xff0c;书籍装帧设计&#xff0c;插画设计&#xff0…

韩信点兵问题,鸡兔同笼问题,闰年判断问题等,我用Python瞬间搞定(13)

小朋友们好&#xff0c;大朋友们好&#xff01;我是猫妹&#xff0c;一名爱上Python编程的小学生。欢迎和猫妹一起&#xff0c;趣味学Python。今日主题最近猫妹一直在练习Python编程&#xff0c;有些习题真是经典啊&#xff01;比如韩信点兵问题&#xff0c;比如鸡兔同笼问题等…

【Linux】线程实例 | 简单线程池

今天来写一个简单版本的线程池 1.啥是线程池 池塘&#xff0c;顾名思义&#xff0c;线程池就是一个有很多线程的容器。 我们只需要把任务交到这个线程的池子里面&#xff0c;其就能帮我们多线程执行任务&#xff0c;计算出结果。 与阻塞队列不同的是&#xff0c;线程池中内有…

代码随想录刷题-数组-螺旋矩阵II

文章目录螺旋矩阵 II习题我的解法别人的解法螺旋矩阵 II 本节对应代码随想录中&#xff1a;代码随想录&#xff0c;讲解视频&#xff1a;一入循环深似海 | LeetCode&#xff1a;59.螺旋矩阵II_哔哩哔哩_bilibili 习题 题目链接&#xff1a;59. 螺旋矩阵 II - 力扣&#xff0…

将spring boot项目打包成一个可执行的jar包

将spring boot项目打包成一个可执行的jar包&#xff0c;jar包自带了整个运行环境简化配置&#xff0c;可直接运行&#xff0c;本次使用HelloWorld项目演示。 创建Spring Boot项目在pom.xml中导入插件 <build><plugins><plugin><groupId>org.springfr…