利用鸽巢原理,第一次遍历。对于每一个nums[i],在nums[nums[i] - 1]上加n用来标识nums[i]的存在,加上n之后,nums[nums[i] - 1]一定>n。第二次遍历,不大于n的话就知道哪个数不在数组中:
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
int n = nums.length;
List<Integer> ans = new ArrayList<>();
for(int num : nums) {
int x = (num - 1) % n;
nums[x] += n;
}
for(int i = 0; i < nums.length; i++) {
if(nums[i] <= n) {
ans.add(i + 1);
}
}
return ans;
}
}