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. ( ...
随机推荐
- 从kratos分析breaker熔断器源码实现
为什么要用熔断 前面我们讲过限流保证服务的可用性,不被突如其来的流量打爆.但是两种情况是限流解决不了的. 如果我们服务只能处理1000QPS,但是有10wQPS打过来,服务还是会炸.因为拒绝请求也需要 ...
- 记一次 .NET 某机械臂智能机器人控制系统MRS CPU爆高分析
一:背景 1. 讲故事 这是6月中旬一位朋友加wx求助dump的故事,他的程序 cpu爆高UI卡死,问如何解决,截图如下: 在拿到这个dump后,我发现这是一个关于机械臂的MRS程序,哈哈,在机械臂这 ...
- Spring Cloud Eureka 实践(一)
Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,主要在Spring Cloud架构中提供服务注册发现的功能.那么是不是可以尝试在本地搭一个单例Eu ...
- windows系统框架
- js判断是在移动端还是在pc端
function chatQQ3(){ if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { //移动端打开 ...
- BeanFactory和ApplicationContext对比
一.BeanFactory和ApplicationContext对比 其中,ApplicationContext容器即时加载,就是一加载配置文件,就会创建对象,且自动装配bean(即写道xml中bea ...
- try catch处理流的异常
1.try catch处理异常 try{} catch(Exception e){} finally{ 必然执行的代码,一般是释放资源 } 2.流使用try catch处理异常 其中,变量作用域只在当 ...
- 富文本编辑器-SpringBoot
目录 简介 Editor.md 基础工程搭建 数据库设计 基础项目搭建 文章编辑整合(重点) 图片上传问题 表情包问题 文章展示 简介 项目地址:https://gitee.com/zwtgit/ri ...
- 苹果手机input输入文字消失,看不见
这里的方法是: 原来字体是12号,改成15号或其他大一点的字号
- javascript DOM 共同父节点
* 查找两个节点的最近的一个共同父节点,可以包括节点自身 input: oNode1 和 oNode2 在同一文档中,且不会为相同的节点 function commonParentNode(oNode ...