LeetCode448:找到所有数组中消失的数字

给你一个含 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 <= 105
1 <= nums[i] <= n

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

1. 原地修改

  1. 将 nums[i]-1 位置上的数+n(因为原始数都小于等于n,+n后再遍历数组,此时小于等于n的位置i+1,就是没有出现的数字);
  2. 因为第一步 +n 操作导致 nums[i]-1 位置上的数值被修改,所以用 %n 的方法还原初始值
    public List<Integer> findDisappearedNumbers(int[] nums) {
        int n = nums.length;
        for (int num : nums) {
            int x = (num - 1) % n;
            nums[x] += n;
        }
        List<Integer> ret = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            if (nums[i] <= n) {
                ret.add(i + 1);
            }
        }
        return ret;
    }
  • 复杂度分析
    时间复杂度:O(n)。其中 n 是数组 nums 的长度。
    空间复杂度:O(1)。

你可能感兴趣的:(数据结构与算法,算法,leetcode)