Leetcode 448 线性时间算法
想到的办法是以每个下标index代表index+1的状态,从头扫过去,每遇到一个元素时将这个元素暂存为curr,将此元素的位置上置空(-3表示)表示暂时这个位置对应的元素缺失,然后跳转到curr-1处,将此处置为存在(以-1表示),并将原来的在curr-1的位置上的元素存入curr中,重复执行直到遇到了负数或者curr=nums[curr-1],break出去之后再往下扫。
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums)
{
//has:-1,empty:-2,not has:-3
int length = nums.size();
int curr;
for(int i=0;i<length;i++)
{
if(nums[i]<0) continue;
curr = nums[i];
nums[i] = -3;
if(nums[curr-1]==curr)
{
nums[curr-1] = -1;
continue;
}
while(nums[curr-1]!=curr)
{
if(nums[curr-1]<0)
{
nums[curr-1] = -1;
break;
}
int old_index = curr-1;
curr = nums[curr-1];
nums[old_index] = -1;
}
}
vector<int> ans;
for(int i=0;i<length;i++)
{
if(nums[i]==-3) ans.push_back(i+1);
}
return ans;
}
};
int main()
{
vector<int> v({4,3,2,7,8,2,3,1});
Solution s;
vector<int> ans = s.findDisappearedNumbers(v);
//cout<<'\n';
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<' ';
return 0;
}