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

题目描述:

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

示例1:

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

 题解:

      这个题目的解法有多种,最容易想到的就是暴力法,用双重循环去遍历数组,如果找到相等的两个数,则返回。这种解法虽然很容易想到,但是算法的时间复杂度为 O(n^2),显然算法效率很低下,在这道题目里面,如果按照这样的思路求解会出现超时的错误。下面是双重循环实现的代码。

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        n = len(nums)
        for i in range(n):
            for j in range(i+1,n):
                if nums[i] == nums[j]:
                    return nums[i]

       另一种方法是用一个空的集合来存放这些数字,然后去遍历数组,如果当前的数字在集合里面,则返回这个数字,即它就是我们要求的重复的数字,如果不在集合里面,则把它添加进去。这样做只需要进行一次遍历即可,算法的时间复杂度为 O(n)。

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        dic = set()
        for num in nums:
            if num in dic:
                return num
            else:
                dic.add(num)
        return 0

      第三种方法是使用 Hash 索引法,刚开始 hash 表为一个空的字典,还是去遍历数组,然后用 hash.get() 去取当前的元素,如果能够在字典里面找到当前的这个数,说明它是重复的,返回即可,否则的话执行 hash[num]=num。同样只需要进行一次遍历,算法的时间复杂度为 0(n)。

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        hash = dict()
        for num in nums:
            if not hash.get(num) is None:
                return num
            else:
                hash[num] = num
原文地址:https://www.cnblogs.com/chenjin2018/p/14017113.html