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

本文探讨了一种利用Python实现寻找数组中重复数字的高效方法,即原地交换策略。首先介绍了遍历数组并检查元素是否已存在的解决方案,随后提出使用字典存储元素计数,最后聚焦于原地交换实现,但注意到存在交换操作后未处理返回值的问题。
摘要由CSDN通过智能技术生成

①第一个想到的就是再创建一个新数组,将数组遍历过的数据存入新数组中,检查存入的数据是否在新数组中出现过。

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        if not nums:
            return
        new = []
        for i in range(len(nums)):
            if nums[i] in new:
                return nums[i]
            new.append(nums[i])
#执行用时: 5832 ms
# 内存消耗: 23.5 MB

②还想到一个就是用字典的方法:其实和数组那个差不多的思想。也是先存然后找

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        if not nums:
            return 
        dic = {}
        for num in nums:
            if num not in dic:
                dic[num] = 1
            else:
                return num
# 执行用时:36 ms, 在所有 Python3 提交中击败了94.81%的用户
# 内存消耗:23.6 MB, 在所有 Python3 提交中击败了22.40%的用户

-------------看了题解之后

③可以使用原地交换的方法。题目有提到数组中的数字为0-n-1,那么将数组的索引和内容相对应上就好了

开始没看代码,自己敲了一遍:

        for i in range(len(nums)):
            if i != nums[i]:
                if nums[nums[i]] == nums[i]:
                    return nums[i]
                nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
        return -1

发现有一个致命的错误,就是只能将索引中的数字放在了正确的位置,但是放回来的数字我就没有管了。。所以出错了。。

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        i = 0
        while i < len(nums):
            if nums[i] == i:
                i += 1
                continue
            if nums[nums[i]] == nums[i]: return nums[i]
            nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
        return -1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值