剑指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