给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[2,3]
【中等】
【分析】在看到这道题时想到有一道题是求最小的未出现的整数那道题。两道题有很相似的地方,可以看出数组中真正起作用的是:数组的值在1~n
之间。
数组的值在1~n
之间我们可以先想到二分查找(不适用本题),其次是刚刚说的那道题,利用映射,将1~n
数值是否存在映射成数组的下标和负数。例如数值为4,映射成nums[4-1]=-1*nums[4-1]
- 当下标i的数是负数时,说明abs(i)+1在数组遍历时出现过一次了,再次出现时,就可以把abs(i)+1放入res中。
nums:1~n,index:0~n-1
实际上没有用到额外空间,i是为了代码清晰(实际是可以不需要的)。
class Solution(object):
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res=[]
for num in nums:
i=abs(num)-1
if nums[i]>0:
nums[i]=-1*nums[i]
else:
res.append(i+1)
return res