【LeetCode】442. Find All Duplicates in an Array(C++)
阿新 • • 發佈:2019-01-01
地址:https://leetcode.com/problems/find-all-duplicates-in-an-array/
題目:
Given an array of integers, 1 ≤ a[i] ≤ ( = 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
runtime?
Example:
Input: [4,3,2,7,8,2,3,1]
Output: [2,3]
理解:
陣列本來是從1-n,現在某些元素重複了兩側,要找出重複的元素。
實現:
對於正常的陣列,應該滿足nums[i] == i + 1
,即1在0的位置。。。
對於某個元素,我們判斷nums[i] != nums[nums[i] - 1]
是否成立。對於不存在重複的元素,要通過交換使得其在合適的位置上;對於重複的元素,只要其重複元素在本身的位置上就可以了。(也就是這步是把每個出現的元素的對應位置添上對應的元素),對於多餘的,就隨便放到當前的位置就可以了。
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
int i = 0;
while(i < nums.size()){
if(nums[i]!=nums[nums[i]-1]) swap(nums[i],nums[nums[i]-1]);
else i++;
}
for(i = 0;i<nums.size(); ++i){
if(nums[i]-1!=i)
res.push_back(nums[i]);
}
return res;
}
};