题目:
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?
Example:
Input:
[4,3,2,7,8,2,3,1]
Output:
[2,3]
思路:
将数组内的数字依次交换放入对应的下标,1-n对应nums[0 - (n-1)] 如4放在nums[3], 进行n次交换后,再从头开始遍历,若nums[ i ] != i + 1则为出现两次的元素。
代码:
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> op;
int i=0;
while(i<nums.size()) {
if (nums[i]!=nums[nums[i]-1])
swap(nums[i],nums[nums[i]-1]);
else
i++;
}
for(int i=0;i<nums.size();i++) {
if(nums[i]!=i+1)
op.push_back(nums[i]);
}
return op;
}
};