题目
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过K次的元素只出现K次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
要从当前元素是否需要保留和已经生效的元素作为出发点去思考。
slow 和 fast。初始时,slow 指向第 k 个元素,fast 指向第 k 个元素。slow永远指向最新的可以放置新元素的位置。fast 指针指向的元素与 slow - k 位置的元素是否相同。slow 指针的位置,并将 slow 向后移动一位。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)