算法設計與應用基礎:第一週(2)

442. Find All Duplicates in an Array

Description Submission Solutions
  • Total Accepted: 17019
  • Total Submissions: 32979
  • Difficulty: Medium
  • Contributors: shen5630

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?


Codes:

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

解題思路:關鍵點是nums中元素大小區間爲[1,n],n爲nums元素個數,利用該特性,遍歷nums,對於每一個元素,將其絕對值減1作爲下標若對應元素爲正數則說明該下標(也就是遍歷的元素)第一次出現(此時將其修改爲對應的相反數);若爲負數,則說明對於下標(遍歷的元素)第二次出現,則將該下標加入答案數組。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章