448. Find All Numbers Disappeared in an Array

给一串在区间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 findDisappearedNumbers(int[] nums) {
        List 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;
    }

你可能感兴趣的:(448. Find All Numbers Disappeared in an Array)