給一串在區(qū)間1~n內(nèi)的數(shù)字array,這些數(shù)字出現(xiàn)了0次,1次或2次,找出出現(xiàn)了0次的那些數(shù)字。
O(n) Time O(n) Extra Space
用一個(gè)boolean [] map
來記錄數(shù)字是否重復(fù)。
O(nlogn) Time O(1) Extra Space
sort(),然后在gap處把缺少的加到結(jié)果里。
O(n) Time O(1) Extra Space
其實(shí)我一直以為每個(gè)數(shù)字出現(xiàn)兩次是突破口,但是這題的突破口是所有數(shù)字都是positive integer,這樣你就可以把數(shù)字映射回它本身對(duì)應(yīng)的那個(gè)slot,而且只要用正負(fù)號(hào)來做標(biāo)記。注意不能漏了 if(nums[Math.abs(nums[i])-1]>0)這句否則出現(xiàn)兩次的數(shù)字對(duì)應(yīng)的slot的標(biāo)記會(huì)被取消。
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;
}