1. 程式人生 > >【LeetCode】442. Find All Duplicates in an Array(C++)

【LeetCode】442. Find All Duplicates in an Array(C++)

地址:https://leetcode.com/problems/find-all-duplicates-in-an-array/

題目:

Given an array of integers, 1 ≤ a[i] ≤ n n ( 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 )

O(n) 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;
    }
};