剑指 day 6【JZ3 数组中重复的数字】多种解法

在这里插入图片描述
哈希表。时间o(n),空间o(n)

class Solution:
    def duplicate(self , numbers: List[int]) -> int:
        # write code here
        numberset = set([i for i in range(len(numbers))])
        for number in numbers:
            if number not in numberset:
                return number
            else:
                numberset.remove(number)
        return -1

交换元素。时间o(n),空间o(1)

class Solution:
    def duplicate(self , numbers: List[int]) -> int:
        # write code here
        for i in range(len(numbers)):
            while numbers[i] != i:
                if numbers[i] == numbers[numbers[i]]:
                    return numbers[i]
                numbers[numbers[i]], numbers[i] = numbers[i], numbers[numbers[i]]
        return -1

如果是n+1长度分布在[0,n]区间,即长度比值区间范围至少大1。那么可以用下面的二分法,好处是不修改数组。时间o(nlogn),空间o(1)

class Solution:
    def duplicate(self , numbers) -> int:
        # write code here
        def countNums(numbers, m, n):
            return sum(True for number in numbers if m<=number<=n)

        st, ed = 0, len(numbers)-1
        while st < ed:
            mid = (st+ed)//2
            print("st, mid, ed", st,mid,ed, countNums(numbers, st, mid))
            if countNums(numbers, st, mid) > mid-st+1:
                ed = mid 
            else:
                st = mid+1
        return st
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值