Day2 数组(二)


day2 2023.11.30
代码随想录

1. 977有序数组的平方
第二天做题就遇到点问题了,首先对于该题,简单的暴力平方排序肯定没问题,但一定不是我们要的最优解,我们争取在O(n)的时间复杂度内解决问题,发现对于一个初始数组,平方后的最大值,一定是在两边的。因此可以同时从两边开始索引处理,也就是昨天做的双指针思想。
但是,在开始动手后出了问题,开始想在原始数组上进行更新,但是逻辑理不清。我的想法是,对比两个指针的平方,较大得更新末尾指针,较小的存储在一个temp中,用于下一次循环判断,感觉思路是可以的,但实现起来就有问题,首先,每次循环需要跟上一次temp判断,在两者进行对比。两层if嵌套。。。屎山代码得感觉了。其次在后续更新中也有点问题,每次只能更新一个快指针值,但会有剩余值无法更新,因此该思路哪怕可行,但过于繁琐。看了一眼代码随想录正解,发现重新定义了个result数组。。。直接傻眼了,茅塞顿开。。
因此最终声明两个快慢索引,在for循环更新到result中,即可!代码如下:

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> result(nums.size());int lowindex = 0;int fastindex=nums.size()-1;for(int i=nums.size()-1; i>=0;i--){if(nums[fastindex]*nums[fastindex]>=nums[lowindex]*nums[lowindex]){result[i] = nums[fastindex]*nums[fastindex];fastindex--;}else{result[i] = nums[lowindex]*nums[lowindex];lowindex++;}}return result;}
};

2. 209长度最小的子数组
这个题有些难度,首先最直观的做法就是暴力循环,两层佛如,第一层for是子数组,内层for是找到符合要求的最小数组,尝试写了写该暴力方法,测试通过,但提交后当数值过大时出现时间超出限制得问题,因此显然不是最优解:

//暴力遍历法
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int Rlength=INT32_MAX;int sum;int SLength;for(int i=0;i<nums.size();i++){sum=0;SLength=0;for(int j=i;j<nums.size();j++){sum+=nums[j];SLength++;if(sum>=target){Rlength = SLength < Rlength ? SLength:Rlength;break;}}}return Rlength==INT32_MAX? 0:Rlength;}
};

本题真正做法则是滑动窗口法,该方法确实不太了解,因此直接看代码随想录文字讲解,自己在尝试写代码;暴力法中两层for代表了数组起始位置和终止位置,因此滑动窗口则是一个for解决两个问题,那么是该控制起始位置还是终止位置呢,显然,如果控制起始位置,那怎么找终止位置?因为找终止位置得过程一定是需要遍历得,因此滑动窗口得for循环中心是控制终止位置,当然需要通知控制起始位置,因此也需要两个指针,也是双指针得思想。

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int RLength=INT32_MAX;int sum=0;int SLength=0;for(int j=0, i=0;j<nums.size();j++){sum +=nums[j];// SLength++;while(sum>=target){// SLength--;SLength = (j-i+1);RLength = RLength<SLength ? RLength:SLength;sum -=nums[i++];}}return RLength==INT32_MAX ? 0:RLength;}
};

开始我在写代码时,使用的是注释掉的方法记录子数组的长度,并且在暴力方法时也是这样,但这里出现了问题,想着,如果总和超了,起始位置前进时,数组长度减一就好了,但有一种情况,如果现在超了,但减一后又不够,你如果提前减一,在记录长度就有问题,长度应该是减一之前的长度,记录到这里,突然灵光一闪,本来放弃了原本记录长度的方法,但是,突然发现问题所在了,尝试将两行代码位置互换,先记录长度,在减少。就通过啦!!!

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int RLength=INT32_MAX;int sum=0;int SLength=0;for(int j=0, i=0;j<nums.size();j++){sum +=nums[j];SLength++;while(sum>=target){RLength = RLength<SLength ? RLength:SLength;  //这里SLength--;  //这里sum -=nums[i++];}}return RLength==INT32_MAX ? 0:RLength;}
};

因此该方法,我个人认为有个混淆点就是在前进起始位置时,前进与更新长度的顺序问题,应该是先更新位置,再前进起始位置。while中带等号。
总体表达意思:在终止位置固定时,哎呦,现在子数组之和满足要求了唉,那我先记录下来目前的长度,再尝试将起始位置前进一下,咦,依然满足啊,那就再前进一下。。。哦,不满足啦,那最小的就是我上一个记录的啦!再比较与不同终止位置时的最小长度,更新最终最小长度!!!ok!结束!

3. 59螺旋矩阵
螺旋矩阵,很久之前写过,但又忘了,借此机会复习一下,自己写的时候以为两层for循环,更新行列值,想了很久该怎么组织逻辑关系,理不清,最后看代码随想录文字讲解,是按照每一圈为一个循环,每次循环分为四部–上右下左的顺序赋值,达到目的,不过变量有点多,开始没有写遍历长度这个变量,测试通过,但当n=4时就报错了,最后理一遍所有变量;
首先,每层循环的起始点不一样,因此需要两个变量为每次循环提供起始点,并在循环结束后加1.
其次,二维数组的索引肯定需要两个变量
之后,对于n的奇偶不同,结果不同,如果是偶数,则循环为整数,不会落单。但如果为奇数,比如3,想一想,一圈处理后只剩中间一个,因此需要特殊处理,所以需要一个变量代表中间索引
然后,肯定需要一个变量控制循环次数,也就是要处理几圈。
最后,也是我最开始忽略的,每一次循环的每一步处理,到哪里结束?开始以为就是n-1,但这是最外圈的,如果n大一些,比如4,在第二圈循环中,每一步少两个位置,因此减2.所以需要一个控制遍历处理长度的遍历。
最终结果如下:

class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> result(n, vector<int>(n));int startx=0,starty=0;  //位置int loop = n/2;  //循环几次int count=1;  //赋值int mid = n/2;  //单独处理中间int i,j;int length = 1;while(loop--){i = startx;j = starty;for(j=starty;j<n-length;j++){  //上行,左闭右开result[i][j] = count++;}for(i=startx;i<n-length;i++){  //右列 ,上闭下开result[i][j] = count++;}for(;j>starty;j--){  //下行,右闭左开result[i][j] = count++;}for(;i>startx;i--){  //左列,下闭上开result[i][j] = count++;}startx++;starty++;length++;}if(n%2){result[mid][mid] = n*n;  //奇数时单独处理}return result;}
};

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

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

相关文章

传统算法:使用 Pygame 实现线性查找

使用 Pygame 模块实现了线性查找的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过线性查找算法对数组进行查找,动画效果可视化每一步的变化。在查找的过程中,程序逐个遍历数组元素,如果找到目标值,将相应的元素高…

HarmonyOS应用开发者基础认证试题

判断题 1.Ability是系统调度应用的最小单元&#xff0c;是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。(true) 2.Tabs组件仅可包含子组件TabsContent&#xff0c;每一个页签对应一个内容视图即TabContet组件。(true) 3.使用http模块发起网络请求时&#…

最简单的链路追踪收集器

链路追踪可帮助您快速了解程序服务之间的调用关系&#xff0c;并快速洞悉内部发生的情况。主流的链路追踪系统有zipkin,jaeger,skywalking等&#xff0c;由于opentelemetry的存在&#xff0c;都具有opentelemetry的转换器。 我们利用opentelemetry来进行zipkin,jaeger,skywalk…

Vue H5页面长按保存为图片

安装依赖&#xff1a;npm install html2canvas -d <template><div class"index"><div id"captureId" class"capture" v-show"firstFlag"><ul><li>1</li><li>2</li><li>3<…

组合(回溯算法)

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 样例输入 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],…

Java项目学生管理系统二查询所有

学生管理 近年来&#xff0c;Java作为一门广泛应用于后端开发的编程语言&#xff0c;具备了广泛的应用领域和丰富的开发资源。在前几天的博客中&#xff0c;我们探讨了如何搭建前后端环境&#xff0c;为接下来的开发工作打下了坚实的基础。今天&#xff0c;我们将进一步扩展我…

B/S软件开发架构

1.简述 1. B/S框架&#xff0c;意思是前端(Browser 浏览器&#xff0c; 小程序&#xff0c;APP&#xff0c;自己写)和服务器端(Server)组成的系统的框架结构。 2. B/S架构也可理解为web架构&#xff0c;包含前端、后端、数据库三大组成部分。 2.前端 前端开发技…

什么是数据分析

数据分析是通过总结数据的规律来解决业务问题。数据分析包括如下几个主要内容&#xff1a; 现状分析&#xff1a;分析现在发生了什么 原因分析&#xff1a;分析为什么会发送这种情况 预测分析&#xff1a;预测未来会出现什么 数据分析的基本流程&#xff1a;获取数据&#…

【智力题】钟表的时针、分针、秒针每天重合多少次?

面试的时候遇到一个很好玩的问题&#xff1a;钟表的时针、分针、秒针每天重合多少次&#xff1f; 于是&#xff0c;matlab启动&#xff01; 我分成“指针跳变”、“指针连续”&#xff0c;两个版本进行仿真&#xff1a; 版本一&#xff1a;指针跳变 %% 解释钟表三指针重合问…

【NGINX--10】高可用性部署模式

1、NGINX Plus HA&#xff08;高可用性&#xff09;模式 需要高可用性负载均衡解决方案。 从 NGINX Plus 仓库中安装 nginx-ha-keepalived 包&#xff0c;利用 keepalived 实现 NGINX Plus 的 HA 模式。 详解 nginx-ha-keepalived 包基于 keepalived&#xff0c;管理暴露给客…

Python的集合模块,使用数据容器处理数据集合

大家好&#xff0c;Python是一种功能强大的编程语言&#xff0c;可以简化许多编程任务。它的标准库中有一个collections模块&#xff0c;提供了处理集合数据的有用容器数据类型。 ChainMap类将多个字典合并为一个映射。Counter类用于计算列表或其他可迭代对象中元素的出现次数…

距离向量路由协议——RIP

目录 动态路由动态路由简介为什么需要动态路由动态路由基本原理路由协议的分类 距离向量路由协议RIPv1RIP简介RIPv1的主要特征RIPv1的基本配置RIPv1配置案例被动接口单播更新使用子网地址 RIPv2RIPv2的基本配置RIPv2配置案例 RIPv2的高级配置与RIPv1的兼容性手工路由汇总触发更…

第四十一篇,一次matlab与spdlog的合作

做了一次matlab解析spdlog日志文件并动态绘制行车轨迹的尝试&#xff0c;大获成功。 spdlog的存储&#xff0c;数据头有固定格式如下&#xff1a; 日志类型一个字符空格[日期时间]空格[日志内容tag]空格日志内容 有了固定的格式&#xff0c;做解析就好办了。 &#xff08;日…

快速了解ChatGPT(大语言模型)

目录 GPT原理&#xff1a;文字接龙&#xff0c;输入一个字&#xff0c;后面会接最有可能出现的文字。 GPT4 学会提问&#xff1a;发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记&#xff1a; Lee老师幽默的开场&#xff1a; GPT&#xff1a;chat Ge…

高等数学积分关系定理(格林公式、高斯公式、斯托克斯公式)的理解

1 格林公式、高斯公式、斯托克斯公式 1.1 格林公式&#xff08;Green formula&#xff09; 1.1.1 格林公式例题 1.2 高斯公式&#xff08;Gauss formula&#xff09; 1.2.1 高斯公式例题1 1.2.2 高斯公式例题2 1.3 斯托克斯公式&#xff08;Stokes formula&#xff09; 1.3.1 …

Git修改远程仓库名称

1、先直接在远程点仓库名&#xff0c;然后左侧菜单栏找settings-general&#xff0c;然后直接修改工程名&#xff0c;保存即可。 2、还是在settings-general下&#xff0c;下拉找到Advanced点击Expand展开&#xff0c;然后下拉到最底部 在Change path里填入新的项目名称&#x…

GCN01——Ubuntu中设置vivado编辑器为vscode

确定vscode位置 在命令行中输入 which code得到文件地址 进入文件夹后可看到&#xff0c;这是个链接文件&#xff0c;不过无所谓&#xff0c;就用这个地址就行 设置Text Editor 打开setting选择右侧text editor 这里说明了如何进行设置 将自己的地址加进去就行 /usr/share…

Echarts 设置数据条颜色 宽度

设置数据条颜色&#xff08;推荐&#xff09; let yData [{value: 500,time: 2012-11-12,itemStyle: //设置数据条颜色{normal: { color: red }}},{value: 454,time: 2020-5-17},{value: 544,time: 2022-1-22},{value: 877,time: 2013-1-30}, {value: 877,time: 2012-11-12}]…

亚马逊云科技:探索未来云计算之窗

云计算技术已经成为现代科技领域中至关重要的一个环节&#xff0c;它为各种行业提供了高效、灵活、可扩展的计算和数据存储解决方案。而在这个领域中&#xff0c;亚马逊云科技&#xff08;Amazon Web Services&#xff0c;AWS&#xff09;以其卓越的技术创新和广泛的云服务覆盖…

近期知识点随笔

菜单查询&#xff08;编写权限时的细节&#xff09; 菜单查询list为了侧边框展示更完整&#xff08;不报空指针&#xff09; 登录时&#xff08;用户名&#xff09;查询出多个结果&#xff08;保证用户名唯一&#xff09; 文件上传 前端 对权限与菜单绑定的修改&#xff08;实…