1、数组中重复的数字(python)

题目描述:
找出数组中重复的数字。
一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,
也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3


方法1:
将数组变为有序,依次扫描有序数组,若出现重复数字,则返回该值

def find1(nums):
    nums.sort()
    for i in range(len(nums)-1):
        if nums[i] == nums[i+1]:
            return nums[i]

复杂度分析:python中的sort()是基于快排实现的,所以时间复杂度为O(NlogN),空间复杂度为O(1)。

方法2:
利用字典,统计每个数字出现的次数,返回出现次数大于1的数字

def find2(nums):
    #dict.fromkeys设置任意的value
    numdict = dict.fromkeys(nums,0)
    for i in nums:
        if i in numdict:
            numdict[i] += 1
        if numdict[i] > 1:
                return i

复杂度分析:时间复杂度为O(N),空间复杂度为O(N)。
方法3:
重排数组。从左到右依次扫描数组,判断第i个数字nums[i]是否和i相等。若相等,则扫描下一个;若不等,则将第i个数字和第nums[i]个数字进行比较,相等的话则返回该值,不等的话将两者交换。重复该过程,直到找到重复的数字。

def find3(nums):
    for i in range(len(nums)):
        while i != nums[i]:
            if nums[i] == nums[nums[i]]:
                return nums[i]
            else:
                temp = nums[i]
                nums[i] = nums[temp]
                nums[temp] = temp

复杂度分析:时间复杂度为O(N),空间复杂度为O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值