算法——找出数组中唯一重复的值

条件数组是无序的。区分数组内的数值是否有范围

一、数组内的值没有限制时

        最简单的方法 :空间换取时间

        时间复杂度O(n^2),空间复杂度O(n)

class Solution:
    def FindDup(self, arr):
        if not arr:
            return
        wind = []
        n = len(arr)
        for i in range(n):
            if arr[i] not in wind:
                wind.append(arr[i])
            else:
                return arr[i]
        return 

二、 当数组内的值限定为 1到 n时:

        首先,什么是异或??? 相同为0,不同为1。

        如:10^6 =?转换成二进制,

                        10- 0000 1010 

                          6- 0000 0110   对应bit异或得到: 0000 1100 即12

        1、利用异或的方法:

        自己本身异或 = 0, 0和任何数异或 = 任何数本身。

        利用2次遍历得到重复数。

        举例:   arr = [1, 3, 2, 4, 2]

        得到 0到4的异或(0^1^2^3^4)结果 A,再和数组中的每个数异或

         (0^1^2^3^4) ^(1^3^2^4^2) = 1^1^2^2^2^3^3^4^4 = 2

        

class Solution:
    def FindDup(self, arr):
        if not arr:
            return
        n = len(arr)
        x = 0
        for i in range(n):
            x ^= i
            x ^= arr[i]
        return x
 

        2、求数组和的方法。

        由于限定数组值为1到n-1,arr = [1, 3, 2, 4, 2] 的数值范围为1到4  , 即1+2+3+4=10

        数组内和为 1+3+2+4+2= 12,相差的值即为唯一重复值2

class Solution:
    def FindDup(self, arr):
        if not arr:
            return
        n = len(arr)
        sum1, sum2 = 0, 0
        for i in range(n):
            sum1 += i
            sum2 += arr[i]
        return sum2-sum1
 

相似的题目:

删除排序数组中的重复项

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

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

示例 1:

给定数组 nums = [1,1,2],

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。

class Solution:
    def DeleteDup(self, arr):
        if not arr:
            return
        n = len(arr)
        #双指针法
        p, q = 0, 1
        while q<n:
            #注意该题目是建立在数组已经排序的基础上,所以重复项放一起
            if arr[p] == arr[q]:
            #快慢指针相等时后移
                q += 1
                continue
            #将不重复的赋到p+1位置
            arr[p+1] = arr[q]
            p += 1
            q += 1
        return len(arr[:p+1])

移除指定值的所有元素:

O(1)的空间,删除掉数组中值= val的所有元素并返回。

示例: 输入 arr=[3, 2, 2, 3]  val = 3                 输出 arr=[2, 2]

一样使用双指针:

class Solution:
    def DeleteEle(self, arr, val):
        if not arr:
            return
        n = len(arr)
        p, q = -1, 0
        while q<n:
            if arr[q] == val:
                q += 1
                continue
            arr[p+1] = arr[q]
            p += 1
            q += 1
        return arr[:p+1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值