移除元素的两种方法——双指针

news/2024/11/9 10:03:23/

今日复习了数组部分,对以下题目做了一个整理。
27. 移除元素

这里将不再详细讲述两层for循环的暴力算法。其大致思路是:第一层for循环遍历每一个元素,找到值为val的元素之后,从该位置将每一个元素往前移动一位进行覆盖;整体数组长度减1。

解下来主要讲解两种方法:

方法1:

使用替换的方法,直接将等于val的元素(我们记为ele)用数组末尾元素nums[length]进行替代,然后将数组长度length减去1。这里需要注意的是代替元素ele的末尾元素nums[length]不一定不等于val,所以需要再检测一次,即i -= 1

class Solution:def removeElement(self, nums: List[int], val: int) -> int:length = len(nums) - 1 i = 0while i <= length:if nums[i] == val:nums[i] = nums[length]length -= 1i -= 1i += 1return length + 1

方法2

使用双指针方法求解,双指针在算法题里面非常常见,例如,在本人整理快速排序的时候就有使用到双指针。这里也可以使用相同的思路,将pre作为边界,左边是需要的元素,右边是不确定的元素。cur指针负责找需要的元素,这里是nums[cur] != val

class Solution:def removeElement(self, nums: List[int], val: int) -> int:pre = -1cur = pre + 1length = len(nums)while cur <= len(nums) - 1:if nums[cur] != val:pre += 1nums[pre] = nums[cur]else:length -= 1cur += 1return length

双指针解决数组问题的相似题目

我们寻找相似的题目: 26. 删除有序数组中的重复项,使用双指针方法解决。

class Solution:def removeDuplicates(self, nums: List[int]) -> int:pre = 0cur = 1length = len(nums)while cur <= len(nums) - 1:if nums[pre] != nums[cur]:pre += 1nums[pre] = nums[cur]else:length -= 1cur += 1return length

也可以不使用length来记录数组长度,因为之前提到pre可以看成是有效数组的边界值,所以这里也可以直接返回pre + 1,来作为长度。

同理,283. 移动零,其解决方法如下:

class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""pre = -1 cur = 0while cur <= len(nums) - 1:if nums[cur] != 0:pre += 1nums[pre], nums[cur] = nums[cur], nums[pre]#cur += 1

在 977. 有序数组的平方 中,我们也可以使用双指针:

class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:result = []left = 0right = len(nums) - 1while left <= right: #squaredleft = pow(nums[left], 2)squaredright = pow(nums[right], 2)if squaredleft >= squaredright:result.insert(0, squaredleft)left += 1else:result.insert(0, squaredright)right -= 1return result

这里,我们设置了新的数组result进行返回,由于数组是递增序列,我们这里设置了两个指针分别指向原先数组的头leftright。因为当原数组元素有正有负时,平方后两端元素大于中间元素。当然,我们也可以找出原来元素中最接近0的元素位置(平方后的最小值),然后从它开始向两端移动。


http://www.ppmy.cn/news/160060.html

相关文章

BUG提交单模版一

提交人员 XX 提交时间 2005-06-16 产品名称

win7虚拟计算机名,Win7笔记本电脑启用虚拟wifi共享上网(图文介绍)

新笔记本电脑多半都自带有win7系统&#xff0c;并且是原装正版&#xff0c;现在商务办公人士以及大学生都有自己的笔记本电脑&#xff0c;由于智能手机的普及&#xff0c;wifi无线上网已经非常受用户欢迎&#xff0c;因为不光是笔记本可以共享wifi无线上网&#xff0c;智能手机…

[人工智能-深度学习-39]:环境搭建 - 训练主机硬件选择全指南(CPU/GPU/内存/硬盘/电源)

作者主页(文火冰糖的硅基工坊)&#xff1a;文火冰糖&#xff08;王文兵&#xff09;的博客_文火冰糖的硅基工坊_CSDN博客 本文网址&#xff1a;https://blog.csdn.net/HiWangWenBing/article/details/121207211 目录 前言 第1章 汇总 1.1 选择台式机还是笔记本 1.2 简单汇…

人工智能革命(下):永生还是毁灭

导读&#xff1a;本系列文章讲述了人工智能革命的爆发以及人类未来的出路&#xff0c;由于篇幅较长分为上下两篇&#xff0c;原英文载于神奇的网站WaitButWhy.com&#xff0c;作者Tim Urban还写过一篇有关脑机接口的文章【Neuralink与大脑的神奇未来】&#xff0c;欢迎阅读。本…

人工智能除了下围棋还能干啥?

人工智能除了下围棋还能干啥&#xff1f;这篇科普文将震撼你的世界观 译者注&#xff1a;人工智能很可能导致人类的永生或者灭绝&#xff0c;而这一切很可能在我们的有生之年发生。 上面这句话不是危言耸听&#xff0c;请耐心的看完本文再发表意见。这篇翻译稿翻译完一共三万五…

计算机对未来商业市场的发展,2020年中国笔记本电脑行业市场规模、市场格局及未来发展趋势分析:笔记本电脑行业将在5G时代下快速发展[图]...

一、市场规模 全球笔记本电脑出货量2011年达到顶峰为2.04亿台,受智能手机和平板电脑等可替代消费电子的快速普及的冲击,笔记本电脑所承载的娱乐休闲功能被智能手机、平板电脑所分流,2012年至2016年笔记本电脑出货量整体下滑,下滑趋势较为明显。2018年出货量为1.64亿台,202…

创新工场赖晓凌:最怕纯互联网的人做智能硬件

在智能硬件这块&#xff0c;我绝对不相信原来互联网那套说法&#xff0c;说年轻人&#xff0c;有闯劲、敢想敢为…… 自智能手机之后&#xff0c;通过软硬结合的方式&#xff0c;对传统设备进行改造的智能硬件潮已经汹涌了3年有余&#xff0c;许多看不清的投资人曾把这个领域当…

arch linux安装_安装Arch Linux如何使我的旧笔记本电脑重获新生

arch linux安装 by Jonathan Baldie 乔纳森巴尔迪(Jonathan Baldie) 安装Arch Linux如何使我的旧笔记本电脑重获新生 (How installing Arch Linux brought my old laptop back to life) Got an old computer that is too slow to run Windows? Don’t throw it away or sell …