螺旋矩阵之一套代码过三道题目

代码随想录day2|977.有序数组的平方|209.长度最小的子数组|59.螺旋矩阵II 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。:每个元素进入滑动窗口操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)因为将 nums[start] 从 sum 中减去后,仍然可能满足 sum≥s,故该操作可能不止一次,并且将其元素平方之后,存储子数组(滑动窗口)中的元素和。 阅读详情

这篇博客讲解一下如何用一套代码过三道螺旋矩阵的题目
先看第一道
54. 螺旋矩阵

首先要明确螺旋的循环方向:右下左上……,其次明确上下左右边界。明确这两点就不难做了
一次循环一个方向就填一个值,这样就不会乱了

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int>re;
        int xn=matrix.size();//行数
        int yn=matrix[0].size();//列数
        int loop=xn*yn;//循环次数
        vector<pair<int,int>>around={{0,1},{1,0},{0,-1},{-1,0}};//各个方向的步长
        //边界
        int right=yn-1;
        int bottom=xn-1;
        int left=0;
        int upper=1;
        //开始位置
        int x=0;
        int y=0;
        int dir=0;//当前方向
        while(loop--){
            re.push_back(matrix[x][y]);
            if(dir==0 && y==right){//往右走到了右边界
                dir++;
                right--;

            }
            if(dir==1 && x==bottom){//往下走到了下边界
                dir++;
                bottom--;

            }
            if(dir==2 && y==left){//往左走到了左边界
                dir++;
                left++;

            }
            if(dir==3 && x==upper){//往上走到了上边界
                dir=0;
                upper++;
            }
            //下一个位置
            x+=around[dir].first;
            y+=around[dir].second;
        }
        return re;
    }
};

59. 螺旋矩阵 II

稍微改一下边界情况就OK了

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>>re(n,vector<int>(n));
        int loop=n*n;//循环次数
        vector<pair<int,int>>around={{0,1},{1,0},{0,-1},{-1,0}};//各个方向的步长
        int right=n-1;//右边界
        int bottom=n-1;//下边界
        int left=0;//左边界
        int upper=1;//上边界
        //开始位置
        int x=0;
        int y=0;
        int num=1;
        int dir=0;//0:往右走,1:往下走,2:往左走,3:往上走
        while(loop--){
            re[x][y]=num++;
            if(dir==0 && y==right){//往右走到了右边界
                dir++;
                right--;
            }
            if(dir==1 && x==bottom){//往下走到了下边界
                dir++;
                bottom--;
            }
            if(dir==2 && y==left){//往左走到了左边界
                dir++;
                left++;
            }
            if(dir==3 && x==upper){//往上走到了上边界
                dir=0;
                upper++;
            }
            //下一个位置
            x+=around[dir].first;
            y+=around[dir].second;
        }
        return re;
    }
};

885. 螺旋矩阵 III

这道题和前两道的区别在于开始位置不是从左上角开始,而且是从内往外旋,所以也就会出现越界的情况。
大体上没有改变,这是在填值的时候先判断在界内。

class Solution {
public:
    vector<vector<int>> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
        vector<vector<int>>re;
        int t=1;
        int right=cStart+1;
        int bottom=rStart+1;
        int left=cStart-1;
        int upper=rStart-1;
        int x=rStart;
        int y=cStart;
        vector<pair<int,int>>around={{0,1},{1,0},{0,-1},{-1,0}};//代表右下左上四个方向
        int dir=0;//先向右走
        while(t<=rows*cols){
            if(x>=0 && x<rows && y>=0 && y<cols){
                re.push_back({x,y});
                t++;
            }
            if(dir==0 && y==right){//当前往右走,如果到达了右边界要变向
                dir++;
                right++;//右边界右移
            }
            if(dir==1 && x==bottom){
                dir++;
                bottom++;
            }
            if(dir==2 && y==left){
                dir++;
                left--;
            }
            if(dir==3 && x==upper){
                dir=0;
                upper--;
            }
            //下一个位置
            x+=around[dir].first;
            y+=around[dir].second;
        }
        return re;
    }
};

总结:这三道题目没有设计到什么算法,就是模拟的题目,做这类题目要先分析模拟的过程,分析边界情况,然后再去实操。

基于Simulink的PR(比例谐振)控制器在单相整流中的应用 本文详细介绍了基于Simulink的单相整流系统中PR(比例谐振)控制器的设计与实现方法。首先阐述了PR控制器相较于传统PI控制器的优势,能够有效消除交流信号跟踪中的稳态误差。接着系统讲解了PR控制器的传递函数原理、实用型设计(带带宽)及参数整定方法。通过Simulink建模步骤,包括主功率电路搭建、电压外环PI设计、电流指令生成、PR控制器实现(推荐MATLAB Function方法)和SPWM调制等关键环节。仿真对比显示PR控制在电流跟踪精度(THD仅1.9%)、功率因数(0.998)和动态响应(突变恢 阅读详情

相关推荐

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5714

c++数据结构与算法(6)——数组(螺旋矩阵)

原来很怕的一种题型,但是面试的时候又经常碰到,今天算是硬啃下来了 典型题目 54. 螺旋矩阵 59.螺旋矩阵 II 885.螺旋矩阵 III ———————————— 54.螺旋矩阵 按照遍历方式层层剥开,该类型题方法比较固定,建议理解记忆 class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector&lt...

qq_32008381的博客 2652

Dify工作流教程|以抓取网页并更新知识库为例详细讲解工作流编排过程(附DSL文件)

{"name": "{新建的title变量}","text": "新建的content变量","indexing_technique": "high_quality","process_rule": {"mode": "automatic"}}有没有很痛苦,明明添加书签的网页,当你想阅读的时候,总是找不到或者好不容易找到了,发现网页404了。如果有个小工具,直接能把你输入的链接内容抓取下来,并且加入到你的知识库中,你说他香不香。无法获取授权的,也可以使用网页抓取工具,这个是免费的,抓取效果也可以。

同名公众号:dify实验室 1万+

Spiral Matrix 矩阵的逆时针、顺时针的遍历

#include #include using namespace std; vector spiralOrder(vector> &matrix) { vector> dirs{ {0,1},{1,0},{0,-1},{-1,0} };//逆时针用此行 /* 方向矩阵(0,1)向右;(1,0)向下;(0,-1)向左;(-1,0)向上; 通过调整次序可实现顺时针和逆时针的遍历

学无止境,Fighting! 702

PIC单片机应用开发实践教程(二): 新建工程

File---New ProjectMicrochip Embedded --- Standalone Project 选择所用MCU对应型号 点击 Finish 后,工程就建好了 至止,我们的一个新工程就建完成了!

qq_57798018的博客 2888

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。涵盖环境配置、本体结构设计、实例填充到可视化展示的全流程,特别适合初学者快速掌握知识建模技术。通过实战案例演示,帮助读者理解如何定义类、属性及建立实例关系,是学习知识图谱构建的实用教程。

weixin_42548816的博客 554

矩阵-leetcode#54-螺旋打印矩阵

class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> res; if(matrix.size()<=0) return res; int m = matrix.size()-1; int n = matrix[0].size()-1; .

u011089927的专栏 219

7-1 链式基数排序 (20 分)

7-1 链式基数排序 (20 分) 实现链式基数排序,待排序关键字n满足1≤n≤1000,最大关键字数位≤5。 输入样例: 第一行输入待排序个数n(1≤n≤1000),再输入n个数(n的数位≤5)。 10 278 109 63 930 589 184 505 269 8 83 输出样例: 输出每趟分配-收集后链表中的关键字,趟数为序列中最大值的数位(如样例中930的数位为3),每行结尾有空格。 930 63 83 184 505 278 8 109 589 269 505 8 109 930 63 26

OwemShu的博客 4238

C/C++编程题刷题:leetcode剑指 Offer 29. 顺时针打印矩阵

class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> res; if(matrix.empty()) return res; int m =matrix.size(); int n=matrix[0].size(); ...

Emotion的博客 252

【Python深度学习】做深度学习训练时,如果数据集太大,无法一次性加载进GPU,应该如何做?

方法核心思想优点缺点适用场景实现复杂度小批量训练(Mini-Batch Training)与数据加载器(DataLoader)将数据集划分为小批量,每次只加载一个小批量到GPU中进行训练。- 易于实现- 是深度学习的标准做法- 支持多进程加载- 内存可能成为瓶颈- 需要调整批量大小避免内存不足适用于大部分场景低数据分片与分布式训练(Data Sharding & Distributed Training)将数据集分片,每个GPU或节点处理其中一部分数据,分布式训练。

若北辰 1143

【kubernetes】kubernetes kubeadm init 错误了 怎么回退?

因为虚拟机设置问题首先报错:然后我根据文章修改了核数。重启后,查看VIP运行所在机器,发现机器没有变化然后重新执行初始化后面报错了根据提供的信息,问题主要集中在 kubelet 未能成功启动控制平面组件,导致初始化过程超时。以下是可能的原因及相应的排查步骤:原因 1:kubelet 未运行或运行状态异常正如错误提示所指出,kubelet 可能未运行或处于不健康状态。请按照提示执行以下命令检查 kubelet 的状态和服务日志:根据输出结果,判断 kubelet 是否正常运行。后续一大堆错误。

九师兄 121

【算法】螺旋矩阵

力扣54 双百答案 class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector <int> res; if (matrix.empty()) return res; i...

Chen_Swan的博客 660

173、NPU的编译器开发:开源社区贡献指南

本文分享了在NPU编译器开源社区贡献的经验心得。作者通过实际案例(如卷积维度错误、NaN输出等)阐述了NPU编译器开发的特殊性:硬件迭代快、边界条件复杂、厂商代码不可全信。提出有价值的贡献应聚焦硬件适配测试、性能剖析工具和反模式文档三类内容。强调用实测数据沟通、主动承担维护责任、保持代码通用性等社区协作技巧,并建议通过RFC提前沟通、附硬件实测数据等方式提高PR通过率。最后指出,NPU编译器开发是与聪明人共同填坑的过程,鼓励开发者提交"有诚意的代码"而非完美代码。

m0_50546716的博客 37

虐杀螺旋矩阵(乱杀leetcode,有彩蛋)

目录 题目描述1 思路 题解1 题目描述2 题解2 题目描述3 题解3 致力于帮助大家理解leetcode 本次我将会以套模板的方式来讲解螺旋矩阵,助小伙伴以后再也不用为螺旋矩阵头疼了 一共三题 带你清晰了解螺旋矩阵系列 题目描述1 59. 螺旋矩阵 II 给定一个正整数n,生成一个包含 1 到n^2所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 思路 ...

m0_60264772的博客 416

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

leetcode--螺旋矩阵

给定一个二维数组array,请返回「」该数组的结果。:从左上角开始,按照的顺序提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。north = 0west = 0螺旋遍历从左上角()开始,顺时针按“右、下、左、上”的顺序遍历二维数组。从左到右遍历,即遍历当前的北边界行。从上到下遍历,即遍历当前的东边界列。从右到左遍历,即遍历当前的南边界行。从下到上遍历,即遍历当前的西边界列。

weixin_58628068的博客 1537

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【算法系列-数组】螺旋矩阵(模拟)

【算法系列-数组】螺旋矩阵(模拟)

Mwt258的博客 1239

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

三道题搞定螺旋矩阵

螺旋矩阵顺时针打印螺旋矩阵顺时针构造矩阵不定长步数的顺序打印矩阵坐标 顺时针打印螺旋矩阵 题目链接 打印矩阵最关键的地方在于控制方向和避免重复打印 许多题解用的二维矩阵来表示方向 本文章全篇不用额外矩阵来控制方向,而通过每次要转弯时的动作逻辑来控制 每次在转弯时,即碰到矩阵边界时,需要将下一个遍历方向前进一步,避免重复打印 class Solution { public: vector<int> spiralOrder(vector<vector<int>>&

lzh824359508的博客 185

LeetCode-螺旋矩阵

本文总结了螺旋矩阵类问题的通用解法,包括59题、54题和LCR146题。核心思想是通过控制循环不变量,使用四个边界(top,right,bottom,left)来规范遍历路径。每次循环沿四边按顺序遍历元素,循环结束后边界向中心收缩,直到完成所有元素的遍历。特别注意处理矩阵行列为奇数时中心元素的特殊情况和空数组的边界条件。解法保持一致的遍历规则,确保不重复不遗漏地访问每个元素。 (字数:149字)

weixin_45927386的博客 587

LeetCode 三道高频中等数组算法详解|除自身乘积、矩阵置零、螺旋矩阵

在算法体系中,数组是最基础、最朴素的线性结构,几乎所有高级算法(动态规划、双指针、贪心、单调栈)都建立在数组遍历的基础之上。很多同学刷题卡顿的核心原因,不是看不懂复杂算法,而是基础数组思维不扎实、边界处理不严谨、不会空间优化。LeetCode 中等难度数组题,普遍具备以下特点:逻辑不难,但是细节极多、易错点密集暴力解法能通过部分案例,但无法满足时间、空间要求需要思维转换:拆分遍历、状态标记、边界收缩、空间复用今天讲解的三道题,覆盖了数组算法三大核心经典思想:前后缀拆分思想(238)

2504_94294476的博客 2775

代码随想录算法训练营第2天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

知识点:数组是存放在连续内存空间上的相同类型数据的集合数组下标都是从0开始的一维数组内存空间的地址是连续的那么二维数组在内存的空间地址是连续的么?Java的二维数组在内存中不是 3*4 的连续地址空间,而是四条连续的地址空间组成。

qq_44932556的博客 2228

54. 螺旋矩阵(定义四个方向然后遍历类)

按照顺时针遍历矩阵,将二维矩阵看成一维矩阵遍历每个元素,当索引越界或者元素已经被访问过则改变方向,改变方向顺序为右,下,左,上。螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。注意:本题与主站 54 题相同:https://leetcode-cn.com/problems/spiral-matrix/,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。所有元素,且元素按顺时针顺序螺旋排列的。

YouMing_Li的博客 1310

力扣热门算法题 59. 螺旋矩阵 II,60. 排列序列,61. 旋转链表

59. 螺旋矩阵 II,60. 排列序列,61. 旋转链表,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.21可通过leetcode所有测试用例。

引用原创内容标明出处即可 1275

代码随想录算法训练营第二天 | 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵Ⅱ,54.螺旋矩阵Ⅰ,剑指Offer 29.顺时针打印矩阵

977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵Ⅱ,54.螺旋矩阵Ⅰ,剑指Offer 29.顺时针打印矩阵

m0_67804957的博客 886

【数组】双指针、滑动窗口、螺旋矩阵

双指针、滑动窗口、螺旋矩阵

文森猫的记录 652

【代码随想录训练营第42期 Day2打卡 LeetCode 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II】

【代码随想录训练营第42期 Day2打卡 LeetCode 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II】

记得要努力变强 1127

代码随想录算法训练营第二天|209长度最小的子数组、59 螺旋矩阵

定义矩阵的方法是要在一个一维列表的基础上在里面进行嵌套,对其行进行确定即可定义这里的代码写法有一点需要注意,其内部的循环是模拟人行走的过程,所以代码的行和列顺着旋转即可代码旋转完以后如果是奇数则需要确定中间数值,否则就是可以跳出矩阵在定义一个数字无限大的时候,使用的方法是将其数值定义为float('inf')定义一个n*n矩阵内部全为0的矩阵方法是l = [[0]*n for _ in range(n) ]

angela3264的博客 994
上一篇: 【算法笔记】二叉树应用
下一篇: 【暴力递归之从左往右的尝试模型】
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值