给一串在区间1~n内的数字array,这些数字出现了0次,1次或2次,找出出现了0次的那些数字。
O(n) Time O(n) Extra Space
用一个boolean [] map
来记录数字是否重复。
O(nlogn) Time O(1) Extra Space
sort(),然后在gap处把缺少的加到结果里。
O(n) Time O(1) Extra Space
其实我一直以为每个数字出现两次是突破口,但是这题的突破口是所有数字都是positive integer,这样你就可以把数字映射回它本身对应的那个slot,而且只要用正负号来做标记。注意不能漏了 if(nums[Math.abs(nums[i])-1]>0)这句否则出现两次的数字对应的slot的标记会被取消。
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> res = new ArrayList<>();
if(nums == null || nums.length == 0) return res;
for(int i = 0 ; i < nums.length ; i ++){
if(nums[Math.abs(nums[i])-1]>0)
nums[Math.abs(nums[i])-1] = -nums[Math.abs(nums[i])-1];
}
for(int i = 0 ; i < nums.length ; i ++){
if(nums[i]>0){
res.add(i+1);
}
}
return res;
}