返回轨道
算法 · 2026-05-14 · 21 阅读

P137 缺失的所有数字

算法 21 阅读

信号摘要

难度:Easy · 时长:06:18 · leetcode 448 · lintcode 1236

P137 缺失的所有数字

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个大小为 n 的整数数组,数组中的数字都大于等于 1 并且小于等于 n。你要找出 1 ~ n 这 n 个数字中,没有出现在数组里的数字。

比如说,给你的数组是:

1, 1, 4, 2, 4, 6

这个数组的长度是 6,因此你要返回 1 ~ 6 这 6 个数字里,没有在数组中出现的数字,也就是 [3, 5]。

代码

public class AlgoCasts {

  // Time: O(n), Space: O(n)
  public List<Integer> findDisappearedNumbers(int[] nums) {
    if (nums == null || nums.length == 0) return Collections.emptyList();
    List<Integer> result = new ArrayList<>();
    boolean[] existed = new boolean[nums.length];
    for (int num: nums) existed[num-1] = true;
    for (int i = 0; i < existed.length; ++i)
      if (!existed[i])
        result.add(i+1);
    return result;
  }

  // Time: O(n), Space: O(1)
  public List<Integer> findDisappearedNumbersO1(int[] nums) {
    if (nums == null || nums.length == 0) return Collections.emptyList();
    List<Integer> result = new ArrayList<>();
    for (int i = 0; i < nums.length; ++i) {
      int idx = Math.abs(nums[i]) - 1;
      if (nums[idx] > 0) nums[idx] = -nums[idx];
    }
    for (int i = 0; i < nums.length; ++i)
      if (nums[i] > 0)
        result.add(i+1);
    return result;
  }

}

📡 通讯频道