LeetCode题解1-数组-重复的数字

剑指 Offer 03. 数组中重复的数字

在这里插入图片描述

class Solution:
    # def findRepeatNumber(self, nums: List[int]) -> int:
    #     a = []
    #     for i in range(len(nums)):
    #         if nums[i] not in a:
    #             a.append(nums[i])
    #         else:
    #             return nums[i]
    def findRepeatNumber(self, nums: List[int]) -> int:
        #方法一:利用数组中的append,但时间复杂度o(n^2),空间复杂度为o(n),额外使用了一个列表
        # a = []
        # for num in nums:
        #     if num not in a:
        #         a.append(num)
        #     else:
        #         return num
        # return -1
        
        #方法二:先排序再找重复值,时间复杂度归并排序o(nlogn),空间复杂度o(1)
        # n = len(nums)
        # nums.sort()
        # for i in range(1, n):
        #     if nums[i-1] == nums[i]:
        #         return nums[i]
        # return -1

        #方法三:哈希表,由于哈希表创建了键-值对,添加和查找的时候时间复杂度均为o(1);时间复杂度和空间复杂度均为o(n)
        # dic = set() #哈希表
        # for num in nums:
        #     if num in dic:
        #         return num
        #     dic.add(num)  #注意哈希表添加元素的方式
        # return -1

        #方法四:交换,交换的过程中顺便查重,空间复杂度o(1),时间复杂度o(n)
        # n = len(nums)
        # for i in range(n):
        #     while i != nums[i]: #首先查看nums[i]是否就是i这个值,不是就与nums[i]为index的位置的值交换,是就找到了重复的值
        #         if nums[nums[i]] == nums[i]:
        #             return nums[i]
        #         else:
        #             nums[nums[i]],nums[i] =  nums[i], nums[nums[i]] #注意使用原地交换的时候,不能先给nums[i]赋值,否则后一个的索引会变,换完之后还要判断新的nums[i]是否==i
        #     else: 
        #         continue
        # return -1

        #方法四:交换,交换的过程中顺便查重
        i = 0
        while i < len(nums):
            if nums[i] == i:  #只有这种情况才能+1
                i += 1
                continue
            if nums[nums[i]] == nums[i]: return nums[i]
            nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
        return -1





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值