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); } };
分析:数组
抽屉原理,不是第一次作了,可是仍是很生。app