leetcode_448 Find All Numbers Disappeared in an Array

来源:互联网 发布:阿里云服务器怎么登陆 编辑:程序博客网 时间:2024/05/13 12:35

Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements of [1, n] inclusive that do not appear in this array.

Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[5,6]

翻译:从数组中找到在 1~数组长度 间没出现的那些数,比如数组长度是8,就找1~8间没有出现的数。例子中没出现的是5、6

法1:网友方法,空间复杂度O(1)

public List<Integer> findDisappearedNumbers(int[] nums) {        List<Integer> res = new ArrayList<>();        int n = nums.length;        for (int i = 0; i < nums.length; i ++) nums[(nums[i]-1) % n] += n;        for (int i = 0; i < nums.length; i ++) if (nums[i] <= n) res.add(i+1);        return res;    }

法2:自己的,空间复杂度O(n),借助辅助数组,不好!!

public List<Integer> findDisappearedNumbers(int[] nums) {               List<Integer> my = new ArrayList<>();        boolean[] hasNum = new boolean[nums.length];        for(int i=0;i<nums.length;i++)            hasNum[nums[i]-1] = true;        for(int i=0;i<nums.length;i++)            if(!hasNum[i])                my.add(i+1);        return my;    }
0 0