1、题目描述:
2、题解:
方法1:哈希映射法
思路:
先遍历数组,构建哈希映射
然后遍历哈希映射,找到value == 2 的key。
代码如下:
class Solution:
def findDuplicates(self, nums: List[int]) -> List[int]:
#哈希映射
#先构建一个哈希映射
hashmap = {}
for num in nums:
if num not in hashmap:
hashmap[num] = 1
else:
hashmap[num] += 1
#找出现两次的元素
res = []
for key in hashmap:
if hashmap[key] == 2:
res.append(key)
return res
方法2:原地哈希法:
相同思路的见下面的题,可以对比记忆一下:
原地哈希表:力扣448. 找到所有数组中消失的数字
牛客-剑指offer系列题解:数组中重复的数字(提供了三种方法)
原地哈希表:力扣41. 缺失的第一个正数
思路:
遍历数组,把nums[i] 和i + 1对应起来,实现就是交换,直到nums[i] == nums[nums[i] - 1]:
while nums[i] != nums[nums[i] - 1]:
nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
再次遍历,找重复两次的数字
class Solution:
def findDuplicates(self, nums: List[int]) -> List[int]:
#原地哈希法
for i in range(len(nums)):
while nums[i] != nums[nums[i] - 1]:
nums[nums[i] - 1],nums[i] = nums[i],nums[nums[i] - 1]
res = []
for i in range(len(nums)):
if nums[i] != i + 1:
res.append(nums[i])
return res
3、复杂度分析:
方法1:
时间复杂度:O(N)
空间复杂度:O(N)
方法2:
时间复杂度:O(N)
空间复杂度:O(1)