27. 移除元素

news/2024/10/20 23:31:43

题目

这道题通过是通过了,但是有很多可以改进的地方:

附上本人第一次写通过的代码:

/*slow的作用:作为慢指针,职责是找到val所在的位置quick的作用:作为快指针,职责是找到第一个可以和slow所指的元素互换位置的元素*/class Solution {
public:int removeElement(vector<int>& nums, int val) {if (nums.empty()) return 0;int slow = 0, quick = 0;int n = nums.size();while (quick < n){while (slow < n && nums[slow] != val) slow ++ ;quick = max(slow, quick);while (quick < n && nums[quick] == val) quick ++ ;if (slow < n && quick < n){int tmp = 0;tmp = nums[slow];nums[slow] = nums[quick];nums[quick] = tmp;                }slow ++, quick ++;}return n - (quick - slow);}
};

虽然想到了用快慢指针,但是在对细节的处理上不够好,有点带猜的感觉,思路还是不够清晰。

注意不要自作聪明,认为可以把quick初始化成1,觉得quick不用管nums[0]所在的位置,但是如果数组只有一个元素,那么不会进while循环,没达到判断nums[0]是不是val的目的。

分析下为什么是 return n - (quick - slow);

img

看官方题解

思路很清晰,而且很巧妙

首先是思路一:

总感觉嗅到了点贪心的味道(不太确定hhh)

img

其中区间 [0,left) 中的元素都不等于 val这句话值得学习,通过左右指针的相关操作来维持一个性质。

然后是思路二:

感觉精髓是针对一个不是val的元素就进行一次移动,然后就到了合适的位置,就不动了,而不是多次移动到一个合适的位置。

img

官方方法二代码是这样的:

class Solution {
public:int removeElement(vector<int>& nums, int val) {int left = 0, right = nums.size();while (left < right) {if (nums[left] == val) {nums[left] = nums[right - 1];right--;} else {left++;}}return left;}
};

自己改了点发现也可以

class Solution {
public:int removeElement(vector<int>& nums, int val) {int left = 0, right = nums.size() - 1;while (left <= right) {if (nums[left] == val ){nums[left] = nums[right];right --;}else left ++ ;}return left;}
};

所以关键点还是在left和right相交的那个位置上,我们要让这个位置的数也要得到判定,即这个位置的数也要进入while循环。

附上一张自己分析的图:

img

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

为什么需要边缘计算?边缘计算技术的优势与挑战

边缘计算是一种网络意识形态,侧重于在靠近数据源的地方进行计算,以减少带宽和延迟的使用。在网络边缘进行计算,可以减少数据在服务器和客户端之间的远距离传输。 它是一个共享计算框架,使风险应用更接近数据源,如本地边缘或物联网设备。数据在其源头的存在可以产生强大的商…

关于Window10激活相关(自用,过期了再来看看)

第一步:关闭所有防毒软件,还有Windows防火墙,非常重要,具体的就是:电脑设置-windows安全中心-病毒威胁巴拉巴拉。关闭实时保护,另外下拉 打开排除项-添加巴拉巴拉:添加文件就是可以选压缩包等等,添加文件夹就是文件夹那些,会看不见压缩包,各取所需。不然就会出现类似…

【笔记】CSE 365 - Fall 2024之Linux Luminarium(pwn.college)

超级基础的开始 从学习使用linux系统成为真正的嗨客!【笔记】CSE 365 - Fall 2024之Linux Luminarium(pwn.college) Hello Hackers 本模块将教你与命令行交互的基础知识!命令行允许您执行命令。当您启动终端时,它将执行命令行 “shell”,如下所示: hacker@dojo:~$这称为…

记一次 edu 证书站失败的逻辑漏洞

记一次 edu 证书站失败的逻辑漏洞 闲来无事,在礼物中心看到个证书站,看名称感觉应该挺好挖的,简单信息搜集一波,在 hunter 上查看子域名,发现有个管理系统访问该链接,是个登录框现在需要去搞一手学号什么的了(因为是随便看看的所以没有先信息搜集),利用 hack 语法找了…

源计划智能工厂MES系统(开源版)

在gitee中找到了一个mes系统,这个系统有详细的部署教程,但是我还是遇到了很多问题 下面是自己将其部署到本地的经历 yjh-mes: 源计划MES,后端服务+后台前端界面 (gitee.com) 首先是node版本不对应,而且我没有下载nvm管理node 所以要将node删除后下载nvm。 首先在控制面板…

#2024-2025-1 20241419《计算机基础与程序设计》第四周学习总结

作业信息 课程 要求 目标:门电路 组合电路,逻辑电路 冯诺依曼结构 CPU,内存,IO管理 嵌入式系统,并行结构 物理安全 作业正文 教程学习内容总结: 数字电路: 门电路:实现逻辑运算的单元电路,包括与、或、非等。 组合电路:输出仅与当前输入有关的数字电路。 逻辑电路:由…

2024-2025 20241318 《计算机基础与程序设计》第四周学习总结

这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04这个作业的目标 自学教材计算机科学概论(第七版)第4章,第5章 并完成云班课测试 《C语言程序设计》第3章并完成云班课…

虚拟文件系统和文件系统的挂载

虚拟文件系统 虚拟文件系统(VFS)屏蔽了不同文件系统的差异和操作细节,向上为用户提供了文件操作的统一调用接口,如图 4.24 所示。当用户程序访问文件时,通过 VFS 提供的统一调用函数(如open()等)来操作不同文件系统的文件,而无须考虑具体的文件系统和实际的存储介质。虚拟文…