原题地址(简单)
方法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;}};
