题目描述:
给你一个有序数组 nums
,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成
输入输出实例:
思路:这道题目就是让我们找每个数字有多少个,把超过两个的部分给删除。直观思路就是遍历数组然后删除超过两个的部分。对于这种我们可以选择从后往前遍历删除,因为从前往后遍历,遍历的过程中删除元素的话会影响后面的下标对于数字,从后往前遍历不会影响前面的下标。
我们从后往前遍历,使用一个变量用于存储当前数字有多少个,如果当前数字数量超过两个,那我们选择数组合适的一个子区间然后将这个子区间全部删除,只保留两个数字即可。最后返回删除完之后数组长度。
class Solution:def removeDuplicates(self, nums: List[int]) -> int:#从后往前遍历删除n = len(nums)num_i = n - 1#记录数量count = 1while num_i >= 0 :#找当前数字的数量while num_i > 0 and nums[num_i - 1] == nums[num_i] :num_i -= 1count += 1#只保留两个,从后往前删这样前面的i不会变化if count > 2 :#从num_i + count - 1到num_i + 1倒序删除for i in range(num_i + count - 1,num_i + 1,-1):nums.pop(i)count = 1num_i -= 1return len(nums)