Leetcode 442 Find All Duplicates in an Array
阿新 • • 發佈:2018-12-28
陣列題發現都是考思路的啊,知識點倒沒啥。
題目大意就事給一個長度為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; } };