原题地址(简单)
方法1—原地修改
思路
这道题,没想出来怎么在不使用额外空间且时间复杂度为的情况下做出来,后来看了官方题解。
其实题解的本质是什么呢?
就是利用nums数组下标为0~n-1,来标记出nums数组中出现的数,进而就能筛选出没出现的数。
比如官方题解中的+n操作,其实也可以取负,具体来说就是遍历nums,将取负,再遍历1~n,不是负数的,就说明它未出现。
代码
+n操作
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int i, n = nums.size();
for(auto num : nums) {
i = (num - 1) % n;
nums[i] += n;
}
vector<int> v;
for(int j=0; j<n; j++){
if(nums[j] <= n) v.emplace_back(j+1);
}
return v;
}
};
取负操作
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] *= -1;
}
vector<int> v;
for(int j=0; j<n; j++){
if(nums[j] > 0) v.emplace_back(j+1);
}
return v;
}
};