class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
/*
//解法1
vector<int> result;
for(int i=0;i<nums.size();i++)
{
int cur=nums[i];
while(nums[cur-1]!=cur)
{
int temp=nums[cur-1];
nums[cur-1]=cur;
cur=temp;
}
}
for(int i=0;i<nums.size();i++)
{
if(nums[i]!=i+1)
result.push_back(i+1);
}
return result;
*/
//解法2,不必将元素变换到它对应的下标位置,只需标记一下
vector<int> result;
for(int i=0;i<nums.size();i++)
{
if(nums[abs(nums[i])-1]>0)
nums[abs(nums[i])-1]*=-1;
}
for(int i=0;i<nums.size();i++)
{
if(nums[i]>0) result.push_back(i+1);
}
return result;
}
};
下面算法快一点。只需标记就好不需要移动,想法很巧妙,加一个负号做标记。