4.19——数组双指针——26. 删除有序数组中的重复项 & 27. 删除有序数组中的重复项II & 80. 删除有序数组中的重复项 II
第一次做到数组双指针的题目是80:

因为python的List是可以用以下代码来删除元素的:
del List[index]
所以当时的我直接用了暴力删除第三个重复元素的做法,大概代码如下:
n = len(nums)
for i in range(n):
if 重复了第i个:
del nums[i]
i -= 1
在出来7%+5%的提交成功以后,我去看了题解,才发现了可以用双指针做...
在宫水三叶姐的题解中,能使用双指针的本质是利用了「数组有序 & 保留逻辑」两大主要性质。最早接触双指针,还是在取单链表中间节点时,使用快慢指针来对链表进行遍历。看了leetcode的标签,双指针有很多应用,尤其实在数组和字符串(类似于字符数组)的处理中,以后有遇到双指针处理数组的类似题目会添加在这篇随笔中。
-------------------------------------------------------------------------------------
part1.数据有序,相同元素保留 k 位
在这种题目中,核心要求是:不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
核心思想:使用快慢指针遍历数组,快指针遍历数组中的所有元素,慢指针指向最后一个“合法”的数据,这些数据构成最后的合法数组。
在慢指针“指向”的nums[:slow]的合法数组满足以下条件:
- nums[:slow](后续称为slow数组)保持非降序
- nums[:slow](所有元素) <= nums[fast]
- nums[:slow]中的每个元素最多只重复k次
由1+2,判断当前遍历到的元素nums[fast]是否已经重复了k次,就可以用以下代码来判断:
if nums[fast] != nums[slow - k]:
# 处理 by Python
这行核心代码的判断逻辑如下:
根据2,当前遍历到的元素nums[fast]不小于slow数组的所有数;
根据1,nums[:slow]中的元素是非降序的;
那么当前遍历到的元素nums[fast]只会跟slow数组中最大的数字,也就是最后的数字nums[:slow]相比。同时因为1,保证了这个数字只可能在数组的末尾重复若干次。
这样,只要将nums[fast]跟slow数组的倒数第k个数nums[slow - k]相比:
如果相同,说明nums[fast]已经重复了k次,nums[fast]不需要存储到slow数组中,继续向下遍历:
fast += 1
如果不同,说明nums[fast]还未重复了k次,nums[fast]仍需要存储到slow数组中,将nums[fast]复制到slow数组中,数组边界+1,继续向下遍历:
nums[slow] = nums[fast]
slow += 1
fast += 1
在构成的if语句中有nums[slow - k],需要保证数组不越界,所以最后的算法框架如下:
def removeDuplicates(self, nums):
slow = 0
for fast in range(len(nums)):
if slow < k or nums[fast] != nums[slow - k]:
nums[slow] = nums[fast]
slow += 1
return slow
end
----------------------------------------------------------------------------------------------
4.19——数组双指针——26. 删除有序数组中的重复项 & 27. 删除有序数组中的重复项II & 80. 删除有序数组中的重复项 II的更多相关文章
- 【LeetCode】80. 删除有序数组中的重复项 II
80. 删除有序数组中的重复项 II 知识点:数组:排序:双指针: 题目描述 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使 ...
- [LeetCode每日一题]80. 删除有序数组中的重复项 II
[LeetCode每日一题]80. 删除有序数组中的重复项 II 问题 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外 ...
- 80. 删除有序数组中的重复项 II
题目 给你一个有序数组 nums ,请你原地删除重复出现的元素(不需要考虑数组中超出新长度后面的元素),使每个元素最多出现两次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入 ...
- LeetCode 80. 删除排序数组中的重复项 II
LeetCode 80. 删除排序数组中的重复项 II
- [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值 II
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...
- Java实现 LeetCode 80 删除排序数组中的重复项 II(二)
80. 删除排序数组中的重复项 II 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O ...
- 深入理解php内核 编写扩展 II:参数、数组和ZVALs
原文:http://devzone.zend.com/article/1022-Extension-Writing-Part-II-Parameters-Arrays-and-ZVALs Part I ...
- 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...
- LeetCode 154. Find Minimum in Rotated Sorted Array II寻找旋转排序数组中的最小值 II (C++)
题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...
随机推荐
- Java调用腾讯云短信接口,完成验证码的发送(不成功你来砍我!!)
一.前言 我们在一些网站注册页面,经常会见到手机验证码的存在,这些验证码一般的小公司都是去买一些大的厂家的短信服务,自己开发对小公司的成本花费太大了!今天小编就带着大家来学习一下腾讯云的短信接口,体验 ...
- 20201219 u,v,w
开考前刚起床,所以一边考一边吃饭,然后整场都很迷... A. u 考场 半天才搞懂"下三角区域"指哪个区域,手模样例确认后打了 \(O(qn^2)\) 的裸暴力,然后就不会做了. ...
- NOIP模拟38:b
这是T2. 一个容斥(其实也可以欧拉反演做,但是我不会). 首先开一个桶,记录第i行的j有多少个. 然后枚举1-\(maxn\),枚举他的值域内的倍数,记录倍数在第i行有多少个,将个数 ...
- word域实现动态填充信息附件下载
1.问题描述:在页面上一些下载附件功能,点击触发执行下载操作时候,有些电脑的浏览器可以,有些电脑的浏览器下载不了,电脑打开弹出的下载框下载的不是一个文件,而是一个如jspx后缀名的页面,jspx后缀是 ...
- PreparedStatement预编译的sql执行对象
一.预编译,防sql注入 其中,设置参数值占位符索引从1开始:在由sql 连接对象创建 sql执行对象时候传入参数sql语句,在执行对象在执行方法时候就不用再传入sql语句: 数据库索引一般是从1开始 ...
- 数组字符串json之间的相互转换
数组转字符串 var arr = [1,2,3,4,'巴德','merge']; var str = arr.join(','); console.log(str); // 1,2,3,4,巴德,me ...
- 硕盟SM-T54(TYPE C转HDMI+VGA+USB3.0+PD3.0)
硕盟SM-T54是一款TYPE C转HDMI+VGA+USB3.0+PD3.0四口扩展坞,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显示器.电视机或其他显示设备. ...
- 剑指offer计划16( 排序简单)---java
1.1.题目1 剑指 Offer 45. 把数组排成最小的数 1.2.解法 这题看的题解,发现自己思路错了. 这里直接拿大佬的题解来讲吧. 一开始这里就把创一个string的数组来存int数组 Str ...
- MSSQL2008 无法分配空间,因为PRIMARY文件组已满
1.收缩数据库日志 https://jingyan.baidu.com/article/1709ad808a279f4635c4f060.html 完整代码: --查看数据库的存放位置-- selec ...
- Linux之crontab命令
简介 通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell 脚本.时间间隔的单位可以 是分钟.小时.日.月.周及以上的任意组合.这个命令非常适合周期性的日志分析或数据备份 ...