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<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;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容