数组去重大全(python)

方法一:

使用set直接去重

a=[2,2,1,3,1]
def quchong(arr):
    return list(set(arr))


print(quchong(a))

方法二:

使用字典的key去重

a=[2,2,1,3,1]
def quchong(arr):
    a={}    
    a = a.fromkeys(arr)
    return list(a)


print(quchong(a))

方法三:

使用python语言手写一个去重

a=[2,2,1,3,1]
def quchong(arr):
    s=[]
    for i in arr:
       if i not in s:
           s.append(i)
    return s
print(quchong(a))

方法四:

三中开辟了额外的空间不是本地修改,写一个本地修改的

思路:参考插入选择排序的思想,设置两个指针,一个记录没有重复的位置,一个记录,末尾重复的位置,每次把重复的放到最后。

a=[2,2,1,3,1]
def quchong(arr):
    p=0
    g=len(arr)-1
    
    for j in range(1,len(arr)):
        i=j-1
        while i>=0 and j<=g:
            if a[j]==a[i]:
                a[j],a[g]= a[g],a[j]
                g-=1
                i=j
            i-=1
        if j<=g:
           p+=1
    return arr[:p+1]
print(quchong(a))

方法五:

方法四中虽然可以去重,却是不稳定的,他改变了数字的相对位置,所以针对这个在进行优化。

思路:和上边一样,只是每次不交换,而是直接覆盖掉


class Solution(object):
      def removeDuplicates(self, nums):
            n = len(nums)
            if n <= 1:
                return len(nums)
            i = 0
            j = 1
            while j<n:
                k=i
                while k >= 0:
                    if nums[k] != nums[j]:
                        k -= 1
                    else:
                        break
                if k<0:
                    i+=1
                    nums[i] = nums[j]
                j+=1
            return len(nums[:i+1])
print( Solution().removeDuplicates([0,0,1,1,1,2,2,3,3,4]))

方法六:如果是排序数组,见leecode 26题可以使用,后边的往前覆盖

class Solution(object):
     def removeDuplicates(self, nums):
            n= len(nums)
            if n <= 1:
                return n
            j = 0
            for i in range(1,n):
                if nums[j]!=nums[i]:
                    j+=1
                    nums[j]=nums[i]
            return len(nums[:j+1])

print( Solution().removeDuplicates([0,0,1,1,1,2,2,3,3,4]))

执行结果:

通过

显示详情

执行用时 :80 ms, 在所有 Python 提交中击败了94.00%的用户

内存消耗 :13.5 MB, 在所有 Python 提交中击败了32.71%的用户

leecode 80题:

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n= len(nums)
        if n <= 1:
            return n
        j = 0
        renei= 1
        for i in range(1,n):
            if nums[j]!=nums[i]:
                j+=1
                nums[j]=nums[i]
                renei = 1
            elif renei!=0:
                j += 1
                nums[j] = nums[i]
                renei -= 1
        return len(nums[:j+1])
print( Solution().removeDuplicates([0,0,1,1,1,2,2,3,3,4,5,5,5]))

 

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值