给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
示例:
输入: [4,3,2,7,8,2,3,1] 输出: [2,3]
第一种思路:
调库统计,看看哪些元素只出现了两次。
class Solution(object):
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
dic = collections.Counter(nums)
res = []
for key, value in dic.items():
if value == 2:
res.append(key)
return res
第二种思路:
拿每个元素的绝对值作为下标,
如果是第一次访问该元素,那么nums[p - 1] 》0, 把nums[p]取反,
如果是第二次访问nums[p - 1], 此时的nums[p - 1]就是负的。
class Solution(object):
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = list()
for i, x in enumerate(nums):
p = abs(x)
# print nums, p
if nums[p - 1] < 0: #说明p重复了
res.append(p)
else:
nums[p - 1] *= -1
return res