大家好,我是大唐,刚刷完了几道经典的leetcode题,今天给大家分享一道leetcode上面的快慢指针经典题型---删除有序数组中的重复项,我们往下看。
题目描述
给你一个 非严格递增排列 的数组
nums
,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。
示例
"题目要求把数组中所有重复元素剔除,反过来想实质上就是要求把所有不重复元素保留"
注意! 上面一句话是本题的题眼,理解透彻了该题将迎刃而解
"把所有不重复元素进行保留" 可以通过快慢指针(双指针)来实现 (该思维框架可以总结成模板运用到很多类似题):即定义两个指针slow和fast,fast从左到右把所有元素扫一遍,将不重复的元素赋给slow的下一位
详细步骤
slow = 0,fast = 0,fast负责将所有元素从左到右扫一遍,slow负责承接fast找到的非重复元素
fast不断右移,判断nums[fast]是否等于nums[slow]
(1) 如果相等, 说明fast指向的元素是重复元素,不保留,fast继续右移
(2) 如果不相等, 说明fast指向的元素不是重复元素,保留,然后右移slow一个单位,再把fast的值赋给slow,fast继续右移
重复以上两个步骤直到fast扫完整个数组,最后返回slow + 1即可
代码示例
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
slow,fast = 0,1
while fast < len(nums):
if nums[slow] != nums[fast]:
slow = slow + 1
nums[slow] = nums[fast]
fast = fast + 1
return slow+1
return nums