数组--part 5--螺旋矩阵(力扣59/54)(剑指offer 29)
文章目录
- 基本算法思想
- leetcode 59 螺旋矩阵 II
- leetcode 54 螺旋矩阵
- 剑指Offer 29 顺时针打印矩阵
基本算法思想
建议先去把题目看了,再来思考相关的代码。
错误的想法:实际上这种题型并不存在算法,只涉及到模拟,但是模拟难度并不是很基础,所以逐渐演变到面试官考察的常见题型之一。
建议按照左闭右开的原则(见下图,同种颜色代表着,是同层循环所作的事情),从一开始就定义好,进行循环。
这也就是循环不变量的思想。
理解了循环不变量的思想,接下来来进行介绍一下代码书写的基本思想,以及格式。
vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组int startx = 0, starty = 0; // 定义每循环一个圈的起始位置int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)int count = 1; // 用来给矩阵中每一个空格赋值int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位int i, j;while (loop--) {i = startx;j = starty;// 下面开始的四个for就是模拟转了一圈// 模拟填充上行从左到右(左闭右开)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++;}// 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)startx++;starty++;// offset 控制每一圈里每一条边遍历的长度offset += 1;}// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值if (n % 2) {res[mid][mid] = count;}return res;}
leetcode 59 螺旋矩阵 II
链接
此题基础便来源于上面,自然可以AC。
class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int > >result(n, vector<int >(n, 0));int loop = n / 2;//代表要循环的次数int startx = 0, starty = 0;//确认起始点的位置。int count = 1;//记录此时记录到的数字。int i, j;//记录此时二维数组的位置。int offset = 1;//记录需要停止的位置。//代表需要画多少圈,才能画完所有的数据。但是需要注意的是分奇数偶数//偶数直接画完了,奇数发现还有最中心的一块点没画。while (loop--){//先记录开始的位置 当然也可以放到for当中来初始化。这边只是展示一下。i = startx;j = starty;//开始遍历 先从左往右走,发现是j在遍历,并且确定[),要确定好边界for ( ; j < n - offset; j++){result[i][j] = count++;}//开始从上往下遍历,发现是i在变化,此时j为n-offset,发现刚好不需要进行修改for ( ; i < n - offset; i++){result[i][j] = count++;}//开始从右往左遍历,发现是j在遍历,此时j刚好也是最后一位,end为starty。for ( ; j > starty; j--){result[i][j] = count++;}//开始从下往上遍历,发现是i在遍历,此时i是最后一位,end就是startxfor ( ; i > startx; i--){result[i][j] = count++;}//此时需要更新startx,和starty,以及offset来控制begin和endstartx++;starty++;offset++;}//剩下就是发现是奇数的时候需要给最中间的赋值if (n % 2) {result[n/2][n/2] = count;}return result;
}
};
leetcode 54 螺旋矩阵
链接
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {//首先先提取该矩阵为x行y列的矩阵int lenx = matrix.size(), leny = matrix[0].size();//再按照经典的模拟算法实现。//采用[)的思想进行书写int i, j;int startx = 0, starty = 0;int offset = 1;vector<int> result;//设置循环的次数int loop = min(lenx / 2, leny / 2);//开始循环遍历while (loop--){//先初始化i j;i = startx;j = starty;//开始四次循环绕圈for ( ; j < leny - offset; j++){result.push_back(matrix[i][j]);}for ( ; i < lenx - offset; i++){result.push_back(matrix[i][j]);}for ( ; j > starty; j--){result.push_back(matrix[i][j]);}for ( ; i > startx; i--){result.push_back(matrix[i][j]);}//更新startx starty offsetstartx++;starty++;offset++;}//判断循环次数是奇数还是偶数 if (lenx < leny && lenx % 2 == 1){for (i = startx, j = starty; j < leny - offset + 1; j++){result.push_back(matrix[i][j]);}}else if(lenx >= leny && leny % 2 == 1){for (i = startx, j = starty; i < lenx - offset + 1; i++){result.push_back(matrix[i][j]);}}return result;}
};
剑指Offer 29 顺时针打印矩阵
链接
实际上题目也就是上一题的翻版,但是在提交上一题的答案的时候,你会发现会失败,进去看他传回的代码的样式,发现错误的原因就在于,他传入的数据,不符合二维数组的样式,目测看来估计是java的题目。。
所以在函数的判定最开始前加上一个判断语句就对了
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {if (matrix.size() == 0 || matrix[0].size() == 0) {return {};}//首先先提取该矩阵为x行y列的矩阵int lenx = matrix.size(), leny = matrix[0].size();//再按照经典的模拟算法实现。//采用[)的思想进行书写int i, j;int startx = 0, starty = 0;int offset = 1;vector<int> result;//设置循环的次数int loop = min(lenx / 2, leny / 2);//开始循环遍历while (loop--){//先初始化i j;i = startx;j = starty;//开始四次循环绕圈for ( ; j < leny - offset; j++){result.push_back(matrix[i][j]);}for ( ; i < lenx - offset; i++){result.push_back(matrix[i][j]);}for ( ; j > starty; j--){result.push_back(matrix[i][j]);}for ( ; i > startx; i--){result.push_back(matrix[i][j]);}//更新startx starty offsetstartx++;starty++;offset++;}//判断循环次数是奇数还是偶数 if (lenx < leny && lenx % 2 == 1){for (i = startx, j = starty; j < leny - offset + 1; j++){result.push_back(matrix[i][j]);}}else if(lenx >= leny && leny % 2 == 1){for (i = startx, j = starty; i < lenx - offset + 1; i++){result.push_back(matrix[i][j]);}}return result;}
};
相关文章:

数组--part 5--螺旋矩阵(力扣59/54)(剑指offer 29)
文章目录 基本算法思想leetcode 59 螺旋矩阵 IIleetcode 54 螺旋矩阵剑指Offer 29 顺时针打印矩阵 基本算法思想 建议先去把题目看了,再来思考相关的代码。 错误的想法:实际上这种题型并不存在算法,只涉及到模拟,但是模拟难度并…...

加密解密软件VMProtect入门使用教程(九)许可制度之许可系统功能
VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…...

MySQL基础-事务详解
本文主要介绍MySQL事务 文章目录 前言事务定义事务四大特性(ACID) 事务操作事务并发问题事务隔离级别 前言 参考链接: 链接1链接2 事务定义 事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作…...

python 读写csv文件方法
csv是一种结构化文件,可以将文本转化成矩阵的形式,方便程序读取和处理。下面来介绍一下使用 python读写 csv文件的方法: 1.首先需要使用 pip安装 python包,然后将 csv文件解压到一个文件夹下 2.使用 pip安装 python包,…...

命令行更新Windows
命令行更新Windows powershell命令行更新安装 Windows Update module for Windows Powershell连接到 Windows Update 服务器并下载更新安装下载好的 Windows Update 更新 cmd执行Windows update更新检查更新下载 Windows Update 更新安装更新安装更新后重新启动设备 win10以下版…...
lwIP 多线程注意事项
关于 lwIP 多线程的总结: lwIP 内核不是线程安全的。如果在多线程环境中使用 lwIP,必须使用高层次的 Sequential 或 socket API。使用 raw API 时,需要自己保护好应用程序和协议栈核心代码。在无操作系统环境中使用 raw API: 使用…...
工业革命的本质是动力革命:人类使用能量的水平得到了飞跃(蒸汽动力取代畜力和水力,机械代替人工。)【工业革命的诞生是能量富余的结果】
文章目录 引言I 用能量守恒方式看工业革命的影响1.1 中学物理能量守恒1.2 看清历史事件的影响1.3 工业革命的意义1.4 透过现象看本质的方法II 工业革命的本质2.1 动力革命2.2 多余的能量造就了工业革命引言 人类文明进步的目的是改善人们的生活,任何文明都以养活更多的人口为…...
【Kubernetes】Windows安装kubectl
准备开始 kubectl版本和集群版本之间的差异必须在一个小版本号内。 例如:v1.27版本的客户端能与 v1.26、 v1.27 和 v1.28 版本的控制面通信。 用最新兼容版的 kubectl 有助于避免不可预见的问题。 下载 官方安装文档: https://kubernetes.io/zh/docs/tasks/tools…...

菜鸟健身-新手使用哑铃锻炼手臂的动作与注意事项
目录 一、前言 二、哑铃锻炼手臂的好处 三、哑铃锻炼手臂的注意事项 四、哑铃锻炼手臂的基本动作 1. 哑铃弯举 2. 哑铃推举 3. 哑铃飞鸟 五、哑铃锻炼手臂的进阶动作 1. 哑铃侧平举 2. 哑铃俯身划船 六、哑铃锻炼手臂的训练计划 七、总结 一、前言 哑铃是一种非常…...

二、LLC 谐振变换器
半桥 LLC 谐振变换器主电路结构 如图所示,半桥 LLC 谐振变换器主电路可以分为四个部分,即:逆变网络、谐振网络、变压器及整流滤波网络。两个 MOSFET(S1、S2)以及它们的体二极管(D1、D2)和寄生电…...

JWT 入门
1.介绍 JSON Web Token(JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO…...

理解HttpSession
什么是session 在我刚刚从事后端开发的时候,有一个问题困扰了我很久。 就有个玩意叫session。 PostMapping("login")public Result login(RequestParam("id") String id,RequestParam("password") String password, HttpSession se…...

SolVES 模型生态系统服务功能社会价值评估(基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言)
查看原文>>>SolVES 模型生态系统服务功能社会价值评估(基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言) 目录 第一章、理论基础与研究热点 第二章、SolVES 4.0 模型运行环境配置 第三章、SolVES 4.0 模型运行 第四章、数据获取与入…...

雷鸟Air Plus体验:视觉大幅升级,影视/办公/游戏全能胜任
雷鸟BirdBath系列XR眼镜一直保持着较快的迭代频率,如今迎来该系列第三款产品:雷鸟Air Plus,新品在视觉体验上得到大幅升级,不仅FOV达到49,边缘成像质量更高,搭配索尼旗舰级Micro OLED屏实现最高120Hz刷新率…...
【Android笔记101】Android之实现搜索界面(搜索弹出框)
这篇文章,主要介绍Android之实现搜索界面(搜索弹出框)。 目录 一、搜索弹出框 1.1、运行效果 1.2、搜索弹出框介绍 1.3、实现搜索弹出框功能...
架构中如何消除语义的分歧?
1、发现不同的语境 每一个交互场景其实都存在着多个角色,每个角色都有自己的独立语境。比如商家从供应商那里采购实体商品这个场景,就有它的独立语境。而商家给供应商打款,虽然交互双方没有变化,但是新的场景又会带来的语境。 我…...

「免费版Axure」原型设计工具!
Axure 是一款经典的原型设计工具,但需要下载电脑端软件使用,对新手要求较高,且在线协作效率低,使用成本较高。即时设计是一款免费在线原型设计工具,支持导入 Axure 文件进行二次布局、评审、演示和分享,让用…...

OPNET Modeler 例程——ALOHA和CSMA的性能对比
文章目录 概述一、创建 ALOHA 协议模型二、创建 CSMA 协议模型三、创建收信机进程和节点模型四、创建总线型链路模型五、创建网络模型六、查看仿真结果总结 概述 本例程以以太网为例论述总线型网络的建模方法,对数据链路层的 MAC 技术进行建模分析,并进…...

kali整体版本更新方法,为啥更新?
玩过kali都知道,如果不更新版本,那么安装某个软件总是有很多依赖版本问题,解决起来的确麻烦,这篇文章彻底解决这些问题。 1,更新源 国外源与国内源的选择 kali默认配置的是国外源,但国外源的下载速度非常慢…...

微服务之服务容错
Informal Essay By English Share a sentence that I think is very reasonable, as long as you can know the underlying logic of anything, you can hold it without fear 参考书籍: “凤凰架构” 引言 在 Martin Fowler 与 James Lewis合写的文章《Micros…...
㊗️高考加油
以下是极为详细的高考注意事项清单,涵盖考前、考中、考后全流程,建议逐条核对: 一、考前准备 1. 证件与物品 必带清单: 准考证:打印2份(1份备用),塑封或夹在透明文件袋中防皱湿。身…...
CSS radial-gradient函数详解
目录 基本语法 关键参数详解 1. 渐变形状(Shape) 2. 渐变大小(Size) 3. 中心点位置(Position) 4. 颜色断点(Color Stops) 常见应用场景 1. 基本圆形渐变 2. 椭圆渐变 3. 模…...

WPS中将在线链接转为图片
WPS中将在线链接转为图片 文章目录 WPS中将在线链接转为图片一:解决方案1、下载图片,精确匹配(会员功能)2、将在线链接直接转为图片 一:解决方案 1、下载图片,精确匹配(会员功能) …...
[蓝桥杯 2024 国 B] 立定跳远
问题描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 n 个检查点 a1,a2,...,an且 ai≥ai−1>0。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时,小明可以自行再增加 m 个检查点让自己跳得更轻松。在运动会前…...
springboot的test模块使用Autowired注入失败
springboot的test模块使用Autowired注入失败的原因: 注入失败的原因可能是用了junit4的包的Test注解 import org.junit.Test;解决方法:再加上RunWith(SpringRunner.class)注解即可 或者把Test由junit4改成junit5的注解,就不用加上RunWith&…...
Svelte 核心语法详解:Vue/React 开发者如何快速上手?
在很多地方早就听到过svelte的大名了,不少工具都有针对svelte的配置插件,比如vite \ unocss \ svelte. 虽然还没使用过,但是发现它的star82.9k数很高哦,学习一下它与众不同的魔法。 这名字有点别扭,好几次都写错。 sve…...
SQL 基础入门
SQL 基础入门 SQL(全称 Structured Query Language,结构化查询语言)是用于操作关系型数据库的标准语言,主要用于数据的查询、新增、修改和删除。本文面向初学者,介绍 SQL 的基础概念和核心操作。 1. 常见的 SQL 数据…...
Kafka 快速上手:安装部署与 HelloWorld 实践(一)
一、Kafka 是什么?为什么要学? ** 在大数据和分布式系统的领域中,Kafka 是一个如雷贯耳的名字。Kafka 是一种分布式的、基于发布 / 订阅的消息系统,由 LinkedIn 公司开发,后成为 Apache 基金会的顶级开源项目 。它以…...

【Java后端基础 005】ThreadLocal-线程数据共享和安全
📚博客主页:代码探秘者 ✨专栏:文章正在持续更新ing… ✅C语言/C:C(详细版) 数据结构) 十大排序算法 ✅Java基础:JavaSE基础 面向对象大合集 JavaSE进阶 Java版数据结构JDK新特性…...

微算法科技(NASDAQ:MLGO)基于信任的集成共识和灰狼优化(GWO)算法,搭建高信任水平的区块链网络
随着数字化转型的加速,区块链技术作为去中心化、透明且不可篡改的数据存储与交换平台,正逐步渗透到金融、供应链管理、物联网等多个领域,探索基于信任的集成共识机制,并结合先进的优化算法来提升区块链网络的信任水平,…...