leetcode_442. Find All Duplicates in an Array 找数组中出现两次的数

三种方法在小本本上。

法1(不满足条件用的hash)

class Solution {
public:
    vector findDuplicates(vector& nums) {
        int len=nums.size();
        vector ans;
        if(len<=1) return ans;
     //格外的空间n,时间n
        map tmp;
        for(int i=0;i<=len-1;i++)
        {
            tmp[nums[i]]++;
            if(tmp[nums[i]]==2) 
                ans.push_back(nums[i]);
        } }};

法2(与法三类似,都是基于原有的值,储存出现次数,但是同时保留原有信息)

class Solution {
public:
    vector findDuplicates(vector& nums) {
        int len=nums.size();
        vector ans;
        if(len<=1) return ans;
        int index;
     for(int i=0;i<=len-1;i++)
     {
         index=abs(nums[i])-1;//注意不要越界
         if(nums[index]<0) ans.push_back(index+1);
         nums[index]=-nums[index];
     }
      return ans;  
    }
};						

法3

class Solution {
public:
    vector findDuplicates(vector& nums) {
        int len=nums.size();
        vector ans;
        if(len<=1) return ans;
        int index;
     for(int i=0;i<=len-1;i++)
     {
         index=(nums[i]-1)%len;//注意不要越界
         if(nums[index]>len) ans.push_back(index+1);
         nums[index]=nums[index]+len;
     }
      return ans;  
    }
};

法4(最好,数字归位,最后看nums[i]和i+1的关系,不等则说明nums[i]是重复的)

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


你可能感兴趣的:(LeetCode)