第一次做到数组双指针的题目是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]的合法数组满足以下条件:

  1. nums[:slow](后续称为slow数组)保持非降序
  2. nums[:slow](所有元素) <= nums[fast]
  3. 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的更多相关文章

  1. 【LeetCode】80. 删除有序数组中的重复项 II

    80. 删除有序数组中的重复项 II 知识点:数组:排序:双指针: 题目描述 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使 ...

  2. [LeetCode每日一题]80. 删除有序数组中的重复项 II

    [LeetCode每日一题]80. 删除有序数组中的重复项 II 问题 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外 ...

  3. 80. 删除有序数组中的重复项 II

    题目 给你一个有序数组 nums ,请你原地删除重复出现的元素(不需要考虑数组中超出新长度后面的元素),使每个元素最多出现两次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入 ...

  4. LeetCode 80. 删除排序数组中的重复项 II

    LeetCode 80. 删除排序数组中的重复项 II

  5. [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 ...

  6. Java实现 LeetCode 80 删除排序数组中的重复项 II(二)

    80. 删除排序数组中的重复项 II 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O ...

  7. 深入理解php内核 编写扩展 II:参数、数组和ZVALs

    原文:http://devzone.zend.com/article/1022-Extension-Writing-Part-II-Parameters-Arrays-and-ZVALs Part I ...

  8. 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)

    给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...

  9. 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. ( ...

随机推荐

  1. Java调用腾讯云短信接口,完成验证码的发送(不成功你来砍我!!)

    一.前言 我们在一些网站注册页面,经常会见到手机验证码的存在,这些验证码一般的小公司都是去买一些大的厂家的短信服务,自己开发对小公司的成本花费太大了!今天小编就带着大家来学习一下腾讯云的短信接口,体验 ...

  2. 20201219 u,v,w

    开考前刚起床,所以一边考一边吃饭,然后整场都很迷... A. u 考场 半天才搞懂"下三角区域"指哪个区域,手模样例确认后打了 \(O(qn^2)\) 的裸暴力,然后就不会做了. ...

  3. NOIP模拟38:b

      这是T2.   一个容斥(其实也可以欧拉反演做,但是我不会).   首先开一个桶,记录第i行的j有多少个.   然后枚举1-\(maxn\),枚举他的值域内的倍数,记录倍数在第i行有多少个,将个数 ...

  4. word域实现动态填充信息附件下载

    1.问题描述:在页面上一些下载附件功能,点击触发执行下载操作时候,有些电脑的浏览器可以,有些电脑的浏览器下载不了,电脑打开弹出的下载框下载的不是一个文件,而是一个如jspx后缀名的页面,jspx后缀是 ...

  5. PreparedStatement预编译的sql执行对象

    一.预编译,防sql注入 其中,设置参数值占位符索引从1开始:在由sql 连接对象创建 sql执行对象时候传入参数sql语句,在执行对象在执行方法时候就不用再传入sql语句: 数据库索引一般是从1开始 ...

  6. 数组字符串json之间的相互转换

    数组转字符串 var arr = [1,2,3,4,'巴德','merge']; var str = arr.join(','); console.log(str); // 1,2,3,4,巴德,me ...

  7. 硕盟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的显示器.电视机或其他显示设备. ...

  8. 剑指offer计划16( 排序简单)---java

    1.1.题目1 剑指 Offer 45. 把数组排成最小的数 1.2.解法 这题看的题解,发现自己思路错了. 这里直接拿大佬的题解来讲吧. 一开始这里就把创一个string的数组来存int数组 Str ...

  9. MSSQL2008 无法分配空间,因为PRIMARY文件组已满

    1.收缩数据库日志 https://jingyan.baidu.com/article/1709ad808a279f4635c4f060.html 完整代码: --查看数据库的存放位置-- selec ...

  10. Linux之crontab命令

    简介 通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell 脚本.时间间隔的单位可以 是分钟.小时.日.月.周及以上的任意组合.这个命令非常适合周期性的日志分析或数据备份 ...