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

83 阅读1分钟

题目描述

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

示例 1:
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:2 <= n <= 100000

解题思路1: hash map

重复数据, 我们首先想到的就是使用map记录, 当找到map中的值时, 说明这个元素已经被记录过了.
时间复杂度: O(n)

示例代码1:

def findRepeatNumber(nums: [int]) -> int:
    temp = {}
    for n in nums:
        if n not in temp:
            temp[n] = 1
        else:
            return n

解题思路2: 自身map

对于使用map来说, 我们多开辟了一个map空间, 空间复杂度会变成O(n). 根据题目的限制, 数组的长度为n, 并且元素值是 0~n-1, 所以我们刚好可以使用数组的下标index来当做map的key, 然后, 通过遍历, 将与key相等的元素通过交换, 放到对应的index上, 也就是类似 [0, 1, 2...], 当我们再次遍历到与index相等, 并且index位置上现有的元素也相等,那么这个元素就是重复的元素.
时间复杂度: O(n)

示例代码2:

def findRepeatNumber(nums: [int]) -> int:
    i = 0
    while i < len(nums):
        if nums[i] != i:
            if nums[nums[i]] == nums[i]:
                return nums[i]
            else:
                nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
        else:
            i += 1