数组--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…...
Vite+Electron实战:5分钟打造一个轻量级截图工具(附完整源码)
ViteElectron极速开发:从零构建专业级截图工具的实战指南 在当今快节奏的开发环境中,效率工具已经成为开发者日常工作的刚需。想象一下这样的场景:当你需要快速捕捉API文档片段、保存设计稿细节或记录错误日志时,系统自带的截图工…...
从视频到3D模型:用COLMAP+3D Gaussian Splatting快速重建物体,保姆级数据处理教程
从视频到3D模型:用COLMAP3D Gaussian Splatting快速重建物体,保姆级数据处理教程 在数字内容创作领域,三维重建技术正以前所未有的速度改变着我们记录和呈现世界的方式。想象一下,用手机拍摄一段简单的环绕视频,几小时…...
运算放大电路实战指南:从基础到典型应用
1. 运算放大电路基础入门 第一次接触运算放大电路时,我完全被那些复杂的公式和符号搞晕了。直到后来在实际项目中反复使用,才发现它就像电子世界的"瑞士军刀",功能强大又灵活多变。运算放大器(简称运放)本质…...
基于微信小程序实现培训咨询管理系统【附项目源码】
基于java和微信小程序实现培训咨询系统演示【内附项目源码】微信小程序 小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。尤其拥抱微信生态圈,让微信小程序更加的…...
UG/NX高级加工与仿真模块许可证管理要点
UG/NX高级加工跟仿真模块许可证管理要点你是做研发的,肯定知道,软件许可证不单是买来就管够的。你经历过项目上线前夜,软件全被占用了,你只能干瞪眼;也注意啊到,每年花大几千乃至几十万买的高级模块&#x…...
AI Agent创业公司能给多少钱:股权与薪资对比
?呢干么怎该体具那 不是画大饼,现在市场就是这个价格,好的ai agent研发公司都是抢着要的,由于懂这个的人太少了,而想用这个技能的公司又太多了。我们公司就有一个二本毕业的同学,由于技能牛又懂业务&#x…...
别再只测电压了!用STM32G474的ADC玩点花的:过采样提升精度与多通道扫描实战
突破ADC性能极限:STM32G474过采样与多通道扫描实战指南 对于嵌入式开发者而言,ADC(模数转换器)就像系统的"感官神经",但大多数项目仅停留在基础电压测量层面。STM32G474系列搭载的ADC模块隐藏着令人惊艳的高…...
抖音音频提取开源工具:一键获取背景音乐的高效解决方案
抖音音频提取开源工具:一键获取背景音乐的高效解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...
无感Foc电机控制算法:滑膜观测器结合Vf启动技术,全开源C代码实现,运行顺滑且具有高度参考价值
无感Foc电机控制,算法采用滑膜观测器,启动采用Vf,全开源c代码,全开源,启动顺滑,很有参考价值。DSP28335 滑模观测器无感 FOC 方案深度解析——从“零速”到“高速”的全速域无位置传感器控制 引言 在 PMSM 驱动领域&am…...
农业供应链:冷链物流与库存管理的优化
农业供应链:冷链物流与库存管理的优化 随着消费者对生鲜农产品品质要求的提高,农业供应链中的冷链物流与库存管理成为保障食品安全、减少损耗的关键环节。从田间到餐桌,如何通过技术和管理手段优化这一流程,不仅关系到企业效益&a…...
