leecode第四百四十八题(找到所有数组中消失的数字)

class Solution {
public:
    
    vector<int> meathod1(vector<int>& nums) {
        vector<int> res;
        if(nums.empty()) 
            return nums;
        for(int i=0;i<nums.size();i++)
            nums[(nums[i]-1)%nums.size()]+=nums.size();//修改原数组,每个位置记录:当前位置是否出现过(如果出现过,每出现一次,就在该值上+n)
        
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]<=nums.size())//如果该值<=n,则代表每出现过
                res.push_back(i+1);
        }
        return res;
    }
    
    void swap(vector<int>& nums,int a,int b)
    {
        nums[a]=nums[a]^nums[b];
        nums[b]=nums[a]^nums[b];
        nums[a]=nums[a]^nums[b];
    }
    
    vector<int> meathod2(vector<int>& nums) {
        for(int i=0;i<nums.size();i++)//对每个位置,要求找到该位置本应该出现的值
        {
            while(nums[i]!=i+1&&nums[i]!=nums[nums[i]-1])//要么当前位置符合,要么对应位置符合,负责就换,为了节省空间只能异或换
                swap(nums,i,nums[i]-1);
            
        }
        
        vector<int> res;
        for(int i=0;i<nums.size();i++)//对于排序后不符合的值,记录
        {
            if(nums[i]!=i+1)
                res.push_back(i+1);
        }
        
        return res;
    }
    
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        
        return meathod1(nums);
    }
    
    
};

分析:

抽屉原理,不是第一次做了,但是还是很生。

原文地址:https://www.cnblogs.com/CJT-blog/p/11301957.html