记录刷题的过程。牛客和力扣中都有相关题目,这里以牛客的题目描述为主。该系列默认采用python语言。
1、问题描述:
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
2、数据结构:
数组
3、题解:
方法1:哈希表法
创建集合,然后依次遍历数组,如果数组中的数不在集合中,将其加入集合;如果已在集合中,说明其重复出现,将其作为结果返回。
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
res = set()
for num in numbers:
if num in res:
duplication[0] = num
return True
else:
res.add(num)
return False
方法2:排序法
先排序,然后比较前后两个值,若相等,则赋值和返回True;不相等就令pre = numbers[i]。如果循环结束,没有重复的数字,则返回False。
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
#排序
if len(numbers) < 2:
return False
numbers.sort()
pre = numbers[0]
for i in range(1,len(numbers)):
if pre == numbers[i]:
duplication[0] = pre
return True
else:
pre = numbers[i]
return False
方法3:把数组视为哈希表
相同的方法还有下面的题,可以对比记忆:
原地哈希表:力扣41. 缺失的第一个正数
原地哈希表:力扣442. 数组中重复的数据
原地哈希表:力扣448. 找到所有数组中消失的数字
题目指出 在一个长度为n的数组里的所有数字都在0到n-1的范围内
因此,可遍历数组并通过交换操作使元素的 索引 与 值 一一对应(即 nums[i] = i )。因而,就能通过索引找到对应的值。
遍历中,当第二次遇到数字 x 时,一定有 nums[x] = x (因为第一次遇到 x 时已经将其交换至 nums[x] 处了)。利用以上方法,即可得到一组重复数字。
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
#把数组视为哈希表
i = 0
n = len(numbers)
if n < 2:
return False
while i < n:
if numbers[i] == i:
i += 1
continue
if numbers[numbers[i]] == numbers[i]:
duplication[0] = numbers[i]
return True
numbers[numbers[i]],numbers[i] = numbers[i],numbers[numbers[i]]
return False
4、复杂度分析:
方法1:
时间复杂度:O(N)
空间复杂度:O(N)
方法2:
时间复杂度:O(NlogN)
空间复杂度:O(1)
方法3:
时间复杂度:O(N)
空间复杂度:O(1)