题目
给你一个有序数组 nums
,请你 原地 删除重复出现的元素,使得出现次数超过K次的元素只出现K次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
算法思路
要从当前元素是否需要保留和已经生效的元素作为出发点去思考。
- 初始化两个指针:
slow
和fast
。初始时,slow
指向第 k 个元素,fast
指向第 k 个元素。slow永远指向最新的可以放置新元素的位置。 - 比较
fast
指针指向的元素与slow - k
位置的元素是否相同。 - 如果不相同,说明当前元素可以将其移动到
slow
指针的位置,并将slow
向后移动一位。 - 如果相同,说明当前元素的重复次数已经超过 k 次,可以跳过该元素,只移动
fast
指针。 - 遍历完整个数组后,返回
slow
的值即为删除重复出现元素后的新长度。
def removeDuplicates(nums, k):
if len(nums) <= k:
return len(nums)
slow = k
for fast in range(k, len(nums)):
if nums[fast] != nums[slow - k]:
nums[slow] = nums[fast]
slow += 1
return slow
优化一下:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
def solve(k):
u = 0
for x in nums:
if u < k or nums[u - k] != x:
nums[u] = x
u += 1
return u
return solve(2)