给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[2,3]
解题思路:
不用到额外空间,则需要在原数组上进行修改。因为有这一条件1 ≤ a[i] ≤ n (n为数组长度),最大的元素值不超过数组长度,所以可以考虑将每个元素排在相应的位置上,例如数字3,将其放在第三个位置上(索引为2处),如果 索引值+1 != 元素值,则证明该值最少出现两次。
代码实现:
class Solution(object):
def findSame(self, nums):
res = []
length = len(nums)
i = 0
while i < length:
#调整元素位置
if nums[i] != nums[nums[i] - 1]:
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i] - 1]
else:
i += 1
#查找重复元素
for i in range(length):
if nums[i] != i + 1:
res.append(nums[i])
return res