1. 程式人生 > >Leetcode 442 Find All Duplicates in an Array

Leetcode 442 Find All Duplicates in an Array

陣列題發現都是考思路的啊,知識點倒沒啥。

題目大意就事給一個長度為n的陣列,陣列的元素值域是[1,n],並且這些每個數存在不超過兩次,要求找出出現次數為2的元素。

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twiceand others appear once.

Find all the elements that appear twice in this array.

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[2,3]

先來說下我自己的思路,我比較菜,所以是笨辦法。用unordered_map,先判斷在不在map裡,如果不在就加進去,令他等於1.

如果在,就新增到ans數組裡。直接看程式碼吧

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        unordered_map<int,int> m;
        vector<int> ans;
        for(int i=0;i<nums.size();i++){
            if(m.find(nums[i])==m.end()){
                m[nums[i]]=1;
            }
            else{
                if(m[nums[i]]>1)continue;
                m[nums[i]]++;
                ans.push_back(nums[i]);
            }
        }
        return ans;
    }
};

下面說一下大佬的解法:

大佬說 這道題類似Find the Duplicate Number

因為每個元素都是在 [1,n],所以對於每個nums[i],如果nums[abs(nums[i])-1]<0,說明這是出現了第二次,直接新增到ans數組裡。否則就說明是第一次出現,取相反數。死過一。。。。。反正我是不可能想到這種方法的。

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        vector<int> ans;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[abs(nums[i])-1]<0){ans.push_back(abs(nums[i]));}
            else
                nums[abs(nums[i])-1]=-nums[abs(nums[i])-1];
        }
        return ans;
    }
};