原地hash查重

https://leetcode.cn/problems/find-all-duplicates-in-an-array/
1.值域和变量相同空间映射

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        //原地hash
        vector<int> ans;
        for(int i=0;i<nums.size();i++){
            int t=nums[i];
            if(t<0 || t-1==i) continue;
            if(nums[t-1]==t){
                ans.emplace_back(t);
                nums[i]=-1; //t已经存在了
            }else{
                int c=nums[t-1];
                nums[t-1]=t;
                nums[i--]=c;
            }
        }
        return ans;
    }
};

2.不用swap,前提是值域为正

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        //原地hash,不swap(前提值域为正)
        vector<int> ans;
        for(int i=0;i<nums.size();i++){
            int t=abs(nums[i]);
            if(nums[t-1]<0){
                ans.emplace_back(t);
            }else{
                nums[t-1]=(-1)*nums[t-1];
            }
        }
        return ans;
    }
};

posted @ 2022-05-10 22:17  秋月桐  阅读(32)  评论(0编辑  收藏  举报