442. Find All Duplicates in an Array
- Total Accepted: 17019
- Total Submissions: 32979
- Difficulty: Medium
- Contributors: shen5630
Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements that appear twice in this array.
Could you do it without extra space and in O(n) runtime?
Codes:
#include<cmath>
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> ans;
int size=nums.size();
for(int i=0;i<size;i++)
{
if(nums[fabs(nums[i])-1]<0)
{
ans.push_back(fabs(nums[i]));
}
else
{
nums[fabs(nums[i])-1]=-nums[fabs(nums[i])-1];
}
}
return ans;
}
};
解題思路:關鍵點是nums中元素大小區間爲[1,n],n爲nums元素個數,利用該特性,遍歷nums,對於每一個元素,將其絕對值減1作爲下標若對應元素爲正數則說明該下標(也就是遍歷的元素)第一次出現(此時將其修改爲對應的相反數);若爲負數,則說明對於下標(遍歷的元素)第二次出現,則將該下標加入答案數組。