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. ( ...
随机推荐
- ReScript 与 TypeScript,谁是前端圈的“当红辣子鸡”
摘要: ReScript 和 TypeScript 的出现都是为了更好地使用JavaScript,但两者还是有很大的不同. 本文分享自华为云社区<[云创共驻]ReScript 和 TypeScr ...
- HearthbuddyHelper已经开源
https://github.com/V-arc/HearthbuddyHelper 只是为了稳定,没耗时多久写的一个中控,只是在逐渐堆加,并未进行重构. 通过写这个感受到自己对异步和wpf的理解还有 ...
- 文件包含上传漏洞&目录遍历命令执行漏洞
文件上传漏洞: 一句话木马 一句话木马主要由两部分组成:执行函数与 接收被执行代码的变量 执行函数: eval() assert() create_function() array_map() arr ...
- Redis核心原理与实践--列表实现原理之quicklist结构
在上一篇文章<Redis列表实现原理之ziplist结构>,我们分析了ziplist结构如何使用一块完整的内存存储列表数据. 同时也提出了一个问题:如果链表很长,ziplist中每次插入或 ...
- PHP中的文件系统函数(一)
从这篇文章开始,我们将学习一系列的 PHP 文件系统相关函数.其实这些函数中,有很多都是我们经常用到的,大家并不需要刻意地去记住它们,只要知道有这么个东西,在使用的时候记得来查文档就可以了. 文件路径 ...
- 深入学习Composer原理(四)
本系列第四篇文章,也是最后一篇 首先,我们先看看Composer的源码从哪里看起.当然,请您先准备好源码. composer init或者直接install之后,自动生成了一个vendor目录,这时您 ...
- js特效代码-onmouseover/onclick 改变标签(背景)颜色
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- Linux系列(20) - shutdown
作用 用于关机或重启 例子 [shutdown -h 05:30]:设定凌晨05:30关机 [shutdown -h +30]:30分钟后关机 [shutdown -h now] 立即关机 [shut ...
- oracle 基础SQL语句 增删改
一.SQL操作 查询已创建的数据库:SELECT datname FROM pg_database; 创建数据库:CREATE DATABASE wzxdb; 删除数据库:DROP DATABASE ...
- P7514-[省选联考2021A/B卷]卡牌游戏【贪心】
正题 题目链接:https://www.luogu.com.cn/problem/P7514 题目大意 给出\(n\)个卡牌有\(a_i/b_i\),开始都是\(a_i\)朝上,将不超过\(m\)张卡 ...