给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
示例:
输入: [4,3,2,7,8,2,3,1] 输出: [2,3]
C
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findDuplicates(int* nums, int numsSize, int* returnSize)
{
int n=numsSize;
int* res=(int*)malloc(sizeof(int)*n);
int k=0;
for(int i=0;i<n;i++)
{
int index=abs(nums[i])-1;
if(nums[index]>0)
{
nums[index]=-nums[index];
}
else
{
res[k++]=abs(nums[i]);
}
}
*returnSize=k;
return res;
}
C++
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums)
{
vector<int> res;
int n=nums.size();
for(int i=0;i<n;i++)
{
int index=abs(nums[i])-1;
if(nums[index]>0)
{
nums[index]=-nums[index];
}
else
{
res.push_back(abs(nums[i]));
}
}
return res;
}
};
python
class Solution:
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res=[]
n=len(nums)
for i in range(n):
index=abs(nums[i])-1
if nums[index]>0:
nums[index]=-nums[index]
else:
res.append(abs(nums[i]))
return res