0080. 删除排序数组中的重复项 II
题目地址(80.删除排序数组中的重复项 II)
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/
题目描述
前置知识
双指针
公司
阿里
百度
字节
思路
”删除排序“类题目截止到现在(2020-1-15)一共有四道题:
这道题是26.remove-duplicates-from-sorted-array 的进阶版本,唯一的不同是不再是全部元素唯一,而是全部元素不超过 2 次。实际上这种问题可以更抽象一步,即“删除排序数组中的重复项,使得相同数字最多出现 k 次” 。 那么这道题 k 就是 2, 26.remove-duplicates-from-sorted-array 的 k 就是 1。
上一题我们使用了快慢指针来实现,这道题也是一样,只不过逻辑稍有不同。 其实快慢指针本质是读写指针,在这里我们的快指针实际上就是读指针,而慢指针恰好相当于写指针。”快慢指针的说法“便于描述和记忆,“读写指针”的说法更便于理解本质。本文中,以下内容均描述为快慢指针。
初始化快慢指针 slow , fast ,全部指向索引为 0 的元素。
fast 每次移动一格
慢指针选择性移动,即只有写入数据之后才移动。是否写入数据取决于 slow - 2 对应的数字和 fast 对应的数字是否一致。
如果一致,我们不应该写。 否则我们就得到了三个相同的数字,不符合题意
如果不一致,我们需要将 fast 指针的数据写入到 slow 指针。
重复这个过程,直到 fast 走到头,说明我们已无数字可写。
图解(红色的两个数字,表示我们需要比较的两个数字):
关键点分析
快慢指针
读写指针
删除排序问题
代码
代码支持: Python, CPP
Python Code:
CPP Code:
复杂度分析
令 n 为数组长度。
时间复杂度:$O(n)$
空间复杂度:$O(1)$
基于这套代码,你可以轻易地实现 k 为任意正整数的算法。
相关题目
正如上面所说,相关题目一共有三道(排除自己)。其中一道我们仓库已经讲到了。剩下两道原理类似,但是实际代码和细节有很大不同,原因就在于数组可以随机访问,而链表不行。 感兴趣的可以做一下剩下的两道链表题。
删除排序链表中的重复元素 II
删除排序链表中的重复元素
最后更新于