【Python】【难度:简单】Leetcode 面试题03. 数组中重复的数字【完】

找出数组中重复的数字。


在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 
 

限制:

2 <= n <= 100000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路1

字典法

class Solution(object):
    def findRepeatNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        dict={}
        for i in nums:
            if i not in dict:
                dict[i]=1
            else:
                return i

执行结果:

通过

显示详情

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

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

 

思路2

排序后遍历比较

class Solution(object):
    def findRepeatNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums.sort()
        tmp=nums[0]

        for i in nums[1:]:
            if tmp==i:
                return tmp
            tmp=i
            
        

执行结果:

通过

显示详情

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

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

 

思路3

如果列表中没有重复值,那么应该列表索引与索引指向的值一一对应。逐个判断索引与索引对应值是否相等,如果相等,则继续下一个索引,如果不相等,则判断索引对应的值与该值作为索引的数是否重复,如重复则输出,不重复则进行交换操作。

注意点:

交换数字应该这样书写

nums[nums[i]], nums[i] = nums[i], nums[nums[i]]

而不能写成

nums[i], nums[nums[i]] = nums[nums[i]], nums[i]

原因是该种写法会首先修改nums[i]的值,造成nums[nums[i]]中的索引值造成改变

class Solution(object):
    def findRepeatNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for i in range(len(nums)):
            while i != nums[i]:
                if nums[i] == nums[nums[i]]:
                    return nums[i]
                nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
                

        

执行结果:

通过

显示详情

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值