https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/
版本1
先排序,后遍历。
遍历的时候记录期望的数字,
如果遇到的等于期望的数字,则通过。
如果遇到的数字大于期望的数字,则说明有间隔,将这段间隔记录到结果里面。
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> ans;
sort(nums.begin(),nums.end());
int n=nums.size();
int record=1;
for(int i=0;i<n;i++){
if(nums[i]==record){
record++;
}
else if(nums[i]>record){
while(nums[i]>record){
ans.push_back(record);
record++;
}
record++;
}
}
while(record<=n){
ans.push_back(record);
record++;
}
return ans;
}
};
版本2
利用int可以记录两个信息,一个是数字大小,一个是正负,正负表达的是是否存在当前索引的数字,这样就可以在保留原信息的同时增加新的信息。
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++){
int idx=abs(nums[i])-1;
if(nums[idx]>0)
nums[idx]=-nums[idx];
}
vector<int> ans;
for(int i=0;i<n;i++){
if(nums[i]>0){
ans.push_back(i+1);
}
}
return ans;
}
};