给你一个含 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. 原地修改 将 nums[i]-1 位置上的数+n(因为原始数都小于等于n,+n后再遍历数组,此时小于等于n的位置i+1,就是没有出现的数字);因为第一步 +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)。