题目:
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
首先先读题,这是一个非严格递增排列的数组,数组已经排过序了不需要我们自己再sort一遍
原地删除重复的元素:也就是意味着要在原有数组上进行改动而不是创建一个新数组,而删除元素我们可以用快慢指针法降低时间复杂度同时快慢指针法也保持了元素的相对顺序保持一致,相比于删除特定元素,我们这道题要多走一步,即找出重复的元素
返回唯一元素的数量为k:由于数组最后只剩下唯一元素,所以k也是数组的大小,在快慢指针法中slow的大小也是数组最后一个元素的下标,数组大小=slow+1,也就是说最后我们返回slow+1即可
要应用快慢指针法,我们先弄清楚我们的快慢指针法要做什么工作:
快指针:找到与慢指针指向的元素不相同的元素,也即新数组的元素
慢指针:指向要更新的元素的数组下标,方便我们更新数组
接下来第一步:赋初始值,找到遍历范围
slow从0开始
fast要遍历的范围:从0~len(nums)-1,之所以是0~len(nums)-1原因是数组的下标是从从0~len(nums)-1,由于range()左闭右开的性质,循环可以写作
for fast in range(0, len(nums)):
第二步,明确循环体内的内容
我们先前说过快指针的目的,是要找到与慢指针指向的元素不相同的元素,也即新数组的元素,那么这一句话可以写作if条件语句,就是
if nums[slow] != nums[fast]:
此时fast找到在slow后第一个与slow不相同的元素的下标
接下来慢指针要指向我们要更新的元素的下标,因为我们要让每个元素仅出现一次,所以我们要更新的元素是当前slow指向的后一个元素(保留当前的slow元素)
slow += 1
然后更新元素
nums[slow] = nums[fast]
特殊情况,slow指向的元素本身就只有一个,slow+=1后slow=fast
nums[slow]=nums[fast]后该元素并未改变,不影响结果
遍历完成后,slow是更新数组中最后一个元素的下标,数组大小等于slow+1,返回slow+1即可
return slow + 1
- python3代码:
-
def removeDuplicates(self, nums: List[int]) -> int:
slow=0
for fast in range(0, len(nums)):
if nums[slow] != nums[fast]:
slow += 1
nums[slow] = nums[fast]
return slow + 1