【刷题笔记】448. 找到所有数组中消失的数字

74 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

一、题目描述:

448. 找到所有数组中消失的数字 - 力扣(LeetCode)

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

示例 1:

输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]

示例 2:

输入:nums = [1,1]
输出:[2]

提示:

  • n == nums.length
  • 1 <= n <= 10^5
  • 1 <= nums[i] <= n

进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。

二、思路分析:

转换思路: 其实就是判断 数组当中是否存在 index+1 的数字 列如索引 i 那么是否存在 i+1 数字

那么说明 数组元素 其实也就是 索引 那么通过 元素 % length 就可以得到一个 < length 的索引 标记出出现的索引,然后遍历数组即可,为标记的 就是消失元素

三、AC 代码:

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        // 数据包含 1-n范围
        List<Integer> list=new ArrayList();
        int len=nums.length;
        //取模大法,直接修改原始数组
        //将存在的元素+len 
        for(int n : nums){
            int r=(n-1)%len;
            nums[r]+=len;
        }
        //将正确结果放入结果空间
        for(int i=0;i<len;i++){
            // 比存在的 + len  了,那么比length小的一定就是不存在的
            if(nums[i]<=len)list.add(i+1);
        }
        
        return list;
    }
}

范文参考:

in rust we trust -- vector (find_disappeared_numbers/448. 找到所有数组中消失的数字) - 找到所有数组中消失的数字 - 力扣(LeetCode)

将数组的Value作为下标,更改对应下表的value的符号 - 找到所有数组中消失的数字 - 力扣(LeetCode)

448. 找到所有数组中消失的数字:替换法 - 找到所有数组中消失的数字 - 力扣(LeetCode)