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

 977.有序数组的平方

看到这道题很容易就想到了双指针法,把一个指针放在数组的第一位,另一个放在最后一位,这两个指向的数字相比较,大的那个就一定是平方最大的。以此类推,就能从大到小写出这个有序数组的平方的排序。

但我一直在考虑找到了最大的数字后要如何挪动的问题,在这里卡住了。直到去稍微翻了一眼代码随想录的动图,发现可以再创建一个新数组作为结果集,开拓一个新的空间后就可以很方便地直接从大到小把结果丢进结果集中。

有了这个认识,很快就可以做出来:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(), 0);
        int i= nums.size()-1;//结果集更新到的位置。从大到小开始更新
        int p=0,q=i;
        while(p<=q){
            if(nums[q]*nums[q]>nums[p]*nums[p]){
                result[i--] = nums[q]*nums[q];
                q--;
            }else if(nums[q]*nums[q]<=nums[p]*nums[p]){
                result[i--] = nums[p]*nums[p];
                p++;
            }
        }
        return result;
    }
};

 209.长度最小的子数组

由于四个月前做过这道题,所以当我看到这道题时也很快想到了双指针法,可以通过不断挪动有序数组,截取范围来找到满足条件的长度最小的子数组。

但是还是卡在了如何选取循环条件这里,于是我去看了视频讲解拿下滑动窗口! | LeetCode 209 长度最小的子数组​​​​​​z

认识到了这两点:

1. 得将结束位置作为大的for循环条件

2. sum开始大于target时方可进入while循环

看到这两行代码后,我便没有继续听下去,思考了一下,写出了如下代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int p=0,q=0,len;
        int sum =0;
        int min=nums.size()+1;
        for(int p=0;p<nums.size();p++){//结束位置
            sum += nums[p];
            while(sum>=target){//当sum开始大于target时进入循环
                len = p-q+1;   //本次计算的长度
                if(len<min){   //判断后进行更新
                    min = len;
                }
                sum = sum-nums[q++];  //删掉初始位置的数字
            }
        }
        if(min==nums.size()+1){//如果min的值没有发生变化,说明没找到。
            return 0;
        }else return min;
    }
};

 在for循环中,不断挪动子数组结束位置的指针,同时sum变大。直到sum满足条件大于target时进入while循环。在这个while循环中,我们不断减去初始位置的数字看是不是仍然满足条件,这样就能不断更新最小长度。

 59.螺旋矩阵II

这道题终于是自己AC的了。

思路就是举两个例子,确定好最外层的for循环是圈数后,内部放了四个小的for循环。这四个for循环注意不能有数组元素重叠,所以需要自行制定好规则,每个小的for循环负责n-1个数的赋值,分别往右、往下、往左、往上,从而完成一个圈里的数的赋值。

像n=5,就需要两个圈,加上最中间那个数赋值(作为奇数最后额外赋值正中间的元素)。

n=6,就需要三个圈。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
        int num=1;
        for(int i=0;i<n/2;i++){//i代表循环的第几圈
            int a = i,b;
            for(b=i;b<n-1-i;b++){
                res[a][b]=num++;
            }
            for(a=i;a<n-1-i;a++){
                res[a][b]=num++;
            }
            for(b=n-1-i;b>=1+i;b--){
                res[a][b]=num++;
            }
            for(a=n-1-i;a>=1+i;a--){
                res[a][b]=num++;
            }
        }
        if(n%2) res[n/2][n/2] = n*n;
        return res;
    }
};

 感想

  今天这三道题做起来,大体还算顺利,基本靠一点提示就能写出来,也没出什么bug。而这个提示的部分,是阻碍我独立完成整道题的点,就是我需要特别进行记忆的部分。明天继续加油!

芒果YOLO11改进172:ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea 阅读详情

相关推荐

在AVP28335(兼容德州仪器TMS320-28335) 上实现ModbusSlaveRTU-485源码及注释。

今天先把题目先给出来, 在近两天会把源码 (含详细注释 )及部署、测试结果给出来, 希望能给大家帮助。(全免费 我有点缺德,断了别人的一个财路)。

FOOLCODE的专栏 642

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

两天的刷题学习,学到的方法有二分法、双指针、滑动窗口和模拟过程深刻理解了代码的编写过程与功能实现的思考过程,总得来说收获颇丰,下图是代码随想录的数组部分总结图,贴过来记录一下hhh。ps:文章中有部分图文和理论来自代码随想录。

zhang1282882326的博客 2124

深入解析 ReDoc:从零构建高性能 API 文档的终极指南

ReDoc 是一个强大的开源工具,用于将 OpenAPI 规范转换为高质量、响应式的 API 文档。本文详细介绍了如何使用 ReDoc 构建和自定义 API 文档,包括如何编写支持 OpenAPI 的 API 注解、配置 HTML 页面以加载文档,以及如何利用 ReDoc 的高级功能进行定制。通过实例代码,您将学会如何灵活地展示 API 文档,提升用户体验。无论是初学者还是经验丰富的开发者,都能从本文中获得实用的技巧与方案,帮助快速搭建符合需求的 API 文档界面。

楠搏万的博客 4626

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

做题状态:看完视频后做出来了。做题状态:看完博客后做出来了。做题状态:看解析后做出来了。

weixin_45612015的博客 877

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下...

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下 CT Image with Window presets This is an example of displaying a ct image along with buttons to set ww/wc pres...

浩秦的博客 1841

数据结构与算法——7-2 一元多项式的乘法与加法运算 (20分)

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出样例: 15 24 -25 22 30 21 -10 2

qazwsxxxxxasd的博客 1484

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

注意边界条件两种写法:左闭右闭,左闭右开。

U_L_Yxan的博客 2354

贝叶斯网络 (Bayesian Networks) 原理与代码实例讲解

贝叶斯网络 (Bayesian Networks) 原理与代码实例讲解 1. 背景介绍 1.1 什么是贝叶斯网络? 贝叶斯网络(Bayesian Networks)是一种基于概率论的图形模型,用于表示随机

AI天才研究院 1333

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

5的矩阵(题中给的图),那么就是[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18],[19,20],[21,22],[23,24],[25]这样的情况去遍历。nums[行][列]中行是不断变化的所以行为i,列是不变的都是最后一列,列=4.nums[行][列]=nums[i][4]nums[行][列]中行是不断变化的所以行为i,列是不变的都是第一列,列=0.nums[行][列]=nums[i][0]nums[行][列]=nums[1][j]

MYSTICSHUN的博客 1212

华为OD机试2025A卷 - 用户调度问题(Java & Python& JS & C++ & C )

题目要求每个用户依次选择当前所能选择的最小资源消耗策略,并且若有多个策略的资源消耗相同,则选择最后一个策略。每个用户的选择是独立的,只考虑该用户的策略和相邻用户的约束,不考虑整个调度序列的全局资源消耗。每个用户根据自己的当前状态(即自己的三种选择的资源消耗)做出局部最优选择:在当前可选的策略中,选择消耗最小的那个。如果有多个最小值,则选择最后一个(根据题意)。这一选择是局部的最优,即在当下最有利的选择,但并不保证最终的整体系统资源消耗是最小的。

算法大师! 1万+

基于DFT的滤波系列:加窗滤波的 Matlab 实现

在实际应用中,你可以尝试不同类型的窗函数(如汉宁窗、汉明窗等)以及不同的滤波参数来获得所需的滤波效果。此外,还可以进一步了解 DFT 和窗函数的原理,以及其他数字信号处理技术的应用。加窗滤波是一种常用的数字信号处理技术,它通过在频域上应用窗函数来改善信号的频谱特性。我们通过定义输入信号、应用窗函数、进行 DFT 和逆 DFT,实现了滤波过程,并通过绘图进行了可视化。在频域上进行加窗滤波的关键是将窗函数应用于 DFT 的结果。首先,我们需要定义一个输入信号,这里我们使用一个简单的正弦波作为示例。

m0_47037246的博客 463

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

本文讨论了三个算法问题:977.有序数组的平方,209.长度最小的子数组,和59.螺旋矩阵II。对于问题977,提出了两种解决方案,一种是暴力解法,先将数组中的元素进行平方,然后再排序;另一种是双指针法。对于问题209,也提出了两种解决方案,一种是暴力解法,通过两层循环遍历所有的子数组;另一种是滑动窗口法,只需要利用一个循环来控制子数组的终止位置,起始位置根据条件自动移动。对于问题59,给出了一种解决方案,通过模拟螺旋路径填充矩阵。

weixin_42797677的博客 1086

移动机器人路径规划中噪声环境下的鲁棒性测试仿真

设计一个二维或三维环境模型,包括静态障碍物和可能存在的动态障碍物。

amy_mhd的博客 126

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

数组:数组是存放在连续内存空间上的相同类型数据的集合,最基础的数据结构注意要点数组下标都是从0开始的数组内存空间的地址是连续的数组的元素是不能删的,只能覆盖(固定的一段内存空间)

Mwicogito的博客 1251

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

型,所以要强制类型转换成int,在前面加上(int%20*),才能给整型赋值,后面(sizeof(int)*2)的意思是分配两个int大小的空间。思路:找每个数组元素大于等于target的子数组最小长度,找到就和已储存的最小长度进行比较和更新,并继续找下个元素满足条件的子数组最小长度。a[i]数组中存放的则是数组第i行数组元素的地址,长度为二维数组的列数j。既找到了每个数组元素起始的满足条件的子数组最小长度,又找到了其中最小的值作为原数组中满足条件的子数组最小长度。

weixin_45014461的博客 1351

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

stillhas的博客 257

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

Leetcode刷题977,209,59

weixin_46176507的博客 734

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

今天的内容依旧为对数组进行操作。

cattte的博客 1325

代码随想录算法训练营第二天 |LeetCode977.有序数组的平方 ,LeetCode209.长度最小的子数组 ,LeetCode59.螺旋矩阵II ,总结

代码随想录算法训练营第二天|LeetCode977.有序数组的平方 ,LeetCode209.长度最小的子数组 ,LeetCode59.螺旋矩阵II ,总结

2301_79647020的博客 1444

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

977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

jjsherlock的博客 1571

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

数组,滑动窗口,螺旋模拟

m0_52925186的博客 1268

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

举个例子,假设 n = 5,offset = 1,starty = 1:range (n - offset, starty, -1) 会生成一个从4递减到2的整数序列,因为 n - offset 是4,starty 是1,所以循环会从4开始递减,直到1之前(不包括1)。“_ ”只是一个占位符,表示循环变量在循环体内不被实际使用,因此我们可以简要理解为这个循环只是为了执行某个操作 n 次,而不需要使用每次循环的具体索引值。1. 滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。

weixin_44334392的博客 1201

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

由此可以使用双指针算法。给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]输入:s = 7, nums = [2,3,1,2,4,3]

qq_41073584的博客 947

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

有关于数组的学习到此为止,不得不说,我发现我此前对数组的认知还比较浅薄,通过这两天的学习,我已经了解到了很多新的解题的思路,收获颇丰。其中最重要的是,我学会了到了双指针的用法,它比两个for循环更加节省时间,也颇具巧思。希望我今后能继续坚持每天的学习。

2302_77519551的博客 1206

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

对原来的数组采用双指针法,一个指针在原数组最前面,一个在最后面,每一次比较一下哪个数的平方更大,将大的写到result的最后面,不断循环,结束。这题没有套路,没有算法, 理清逻辑,Carl哥说得对,坚持循环不变量原则,每一条边都坚持左闭右开原则,按照两层for循环,第一层循环,控制矩阵画到第几圈由外到内一圈圈画,第二层for循环,控制每次画四条边。我写的代码有点乱,建议直接看上面的文章讲解。题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。

m0_73184000的博客 1231

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

需要写四个for循环,第一个循环负责【顶行】的从左至右填充,第二个循环负责【右列】的从上至下填充,第三个循环负责【底行】的从右至左填充,第四个循环负责从下至上的【左列】填充,填充的数字用【num++】来控制,因为矩阵可能有多层,填充完外层,我们就需要进入内层,可以使用【变量k】来控制填充的层数(从外向内填充),最后还需要特别注意的是。解题思路:没有想到特别好的解法,就采用了暴力解法,首先将数组的每个元素平方,然后对数组的元素进行【快速排序】算法,在快排之前先用了冒泡排序,但超时了。[滑动窗口法解析](

HY1018LY的博客 1007
上一篇: 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
下一篇: 代码随想录算法训练营第六天|242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
studyingbear
博客等级 码龄5年 20粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值