【python算法与数据结构入门日志】4:删除排序数组中的重复项02 removeDuplicates02

题目:给你一个有序数组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)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法三:建立元素-个数索引法

建立两个字典diccnt,分别存储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)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值