448. 找到所有数组中消失的数字

这题和之前的268. 丢失的数字 、136. 只出现一次的数字 、387. 字符串中的第一个唯一字符 有类似又有不同的地方

由于本题中的数组元素存在相同元素,有的出现2次,有的出现1次,所以不能使用异或来直接得出结果。

于是我们想到使用哈希表来构建映射关系,参考387题。

但是题目提出了进一步的要求,不使用额外的空间。这里我们利用数组本身来代替哈希表实现对应

的映射关系。key,value对应关系为数组下标,数组的值。由题意我们可以得出以下结论,

数组值得范围[1,n],数组下标[0,n-1],这就让我们有机会把nums[x]与x+1构建对应关系。

我们将nums[i]对n取余可得到num[i]所对应映射得key即index,再将nums[index]+n,这样做得好处

在于一方面使得nums[index]必然大于n,标记index重复,同时不影响nums[index]原值在数组中得映射,因为(nums[index]+n)%n=nums[index]%n

时间O(n),空间O(1)

    public List<Integer> findDisappearedNumbers(int[] nums) {
        int len = nums.length,index=0;
        for (int num:nums){
            // 计算num所对应的数组下标,注意数组从0开始,此处需要-1
            index = (num-1)%len;
            // 使得nums[x]大于n来标记相应下标是否出现在数组中
            nums[index]= nums[index]+len;
        }
        List<Integer> list = new ArrayList<Integer>();
        for (int i=0;i<len;i++){
            // 边界值n需要注意
            if (nums[i]<=len){
                // 数据下标需要+1操作才能代表正确的数字
                list.add(i+1);
            }
        }
        return list;
    }
争取早日不再是一只菜鸡
原文地址:https://www.cnblogs.com/jchen104/p/14661619.html