LeetCode 找到所有数组中消失的数字

78 阅读1分钟

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

一、题目描述:

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) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。

二、思路分析:

一般的思路为新建一个数组记录当前出现过元素的位置,最后返回未出现的位置即可。 但是题目要求不用额外空间所以我们考虑对数组进行原地修改,但是修改会影响后续结果,所以我们需要保证,在i位置处修改了k位置的值后,我们在拿到K位置的值后必须能够还原回去。 根据题目中数组为正的条件,假设我们获得了a[i]处的值k,我们可以取k的绝对值,然后让a[k]处的值<0,对每个k只要出现过,a[k]就会是负的,最后只要遍历将a[i]>0的i输出即可

三、AC 代码:

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> res =new ArrayList<>();
        for(int i=0;i<nums.length;i++){
            int num = Math.abs(nums[i]);
            nums[num-1] = nums[num-1]>0?nums[num-1]*-1:nums[num-1];
        }
        for(int i=0;i<nums.length;i++){
            if(nums[i]>0){
                res.add(i+1);
            }
        }
        return res;
    }
}

四、参考:

448找到所有数组中消失的数字(简单)#原地修改[PHP]「」【salmonl】 - 找到所有数组中消失的数字 - 力扣(LeetCode)

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