题目:给你一个有序数组nums
,请你原地
删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地
修改输入数组并在使用O(1)额外空间的条件下完成。
来源:https://leetcode.cn/leetbook/read/all-about-array/x9nivs/
示例:
输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。
方法一:双指针正序查找法
第一种表达:查找到超过2个相同元素时实时进行删除
def removeDuplicates(self, nums):
a = 0
b = 0
while b < len(nums):
if nums[a] == nums[b]:
if b-a > 1:
del nums[b]
else:
b += 1
else:
a = b
b += 1
return len(nums)
第二种表达:从头将数组改写为最多连续同时出现2个相等元素的数组
def removeDuplicates(self, nums):
n = len(nums)
i = 0
j = 0
while j < n:
if nums[i] != nums[j] :
if i+1 != j:
nums[i+2] = nums[j]
i += 1
j += 1
return i+2
# 作者:辰星
# 链接:https://leetcode.cn/leetbook/read/all-about-array/x9nivs/?discussion=oXUF70
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二:双指针逆序查找法
首先判断列表长度,小于3直接返回。左右两指针从后往前遍历:若两指针所指元素不同,则都向前移动一位(左指针向前移动一位,右指针向前移动一个元素);若两指针所指元素相同,先判断间隔,若小于2则左指针继续前进,若大于2则删除右指针指向的元素。两指针在移动过程中,间隔永远不超过1位,这样确保了只留下两个连续相等的元素。
def removeDuplicates(self, nums):
nlen = len(nums)
if nlen <=2:return nlen
left,right = nlen-2,nlen-1
while left >= 0:
if nums[left] != nums[right]: #若左右指针指向的元素不同,不对元素进行操作
right = left #右指针去左指针位置
left -= 1 #左指针前移一位
else: #若左右指针指向的元素相同
a = right-left + 1 #a用于计算该相同元素连续出现的个数
if a > 2: #如果连续出现的个数超过2个
del nums[right] #删除右指针指向的元素
right -= 1 #右指针前移一位
left -= 1 #左指针前移一位
return len(nums)
# 作者:WEI
# 链接:https://leetcode.cn/leetbook/read/all-about-array/x9nivs/?discussion=3ppTMR
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法三:建立元素-个数索引法
建立两个字典dic
和cnt
,分别存储nums
中出现过的元素,及该元素出现的次数;通过遍历dic,同时参考对应cnt中的个数,对个数大于2的元素实现nums
的移除。
def removeDuplicates(self, nums):
dic=[] #dictionary,记录nums包含的元素的集合
cnt=[] #count,记录nums中每个元素出现的个数
for i in nums: #根据数组建立字典以及出现次数的索引,分别写入dic和cnt;i表示nums中出现的元素
if i not in dic:
dic.append(i)
cnt.append(nums.count(i))
for i in range(len(dic)): #遍历;i表示dic中元素对应的下标
c=cnt[i] #c表示当前元素的数量
while c>2: #移除多余的元素至数量为2
nums.remove(dic[i])
c-=1
# 作者:啊吧啊吧刷代码
# 链接:https://leetcode.cn/leetbook/read/all-about-array/x9nivs/?discussion=muQl60
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。