Leetcode--448. 找到所有数组中消失的数字
发布日期:2021-04-30 21:05:02 浏览次数:102 分类:精选文章

本文共 1132 字,大约阅读时间需要 3 分钟。

为了解决这个问题,我们需要找到数组中在范围 [1, n] 之间没有出现在数组中的数字。我们可以使用归位法来解决这个问题,这种方法的时间复杂度为 O(n),空间复杂度为 O(1),并且不需要额外的数据结构。

方法思路

归位法的核心思想是将数组中的每个元素移动到它应有的位置。具体步骤如下:

  • 归位处理:遍历数组,检查每个元素是否在其应有的位置。如果不在,则将其移动到正确的位置。例如,数字 x 应该放在位置 x。
  • 检查位置:在所有元素都正确归位之后,遍历数组,检查每个位置是否等于其索引 + 1。如果不等于,则该位置对应的数字就是我们要找的缺失数字。
  • 解决代码

    import java.util.ArrayList;
    import java.util.List;
    public class Solution {
    public List
    findDisappearedNumbers(int[] nums) {
    List
    result = new ArrayList<>();
    int n = nums.length;
    // 归位处理
    for (int i = 0; i < n; i++) {
    while (nums[i] != nums[nums[i] - 1]) {
    int temp = nums[nums[i] - 1];
    nums[nums[i] - 1] = nums[i];
    nums[i] = temp;
    }
    }
    // 检查缺失数字
    for (int i = 0; i < n; i++) {
    if (nums[i] != i + 1) {
    result.add(i + 1);
    }
    }
    return result;
    }
    }

    代码解释

  • 归位处理:使用一个循环遍历数组中的每个元素。对于每个元素,检查它是否在其应有的位置。如果不在,则将其移动到正确的位置。这种方法确保每个元素最终都位于其应有的位置。
  • 检查位置:在归位处理完成后,遍历数组,检查每个位置的值是否等于其索引 + 1。如果不等于,则说明该位置对应的数字在数组中没有出现,加入结果列表。
  • 这种方法通过在原数组上进行操作,避免了额外的空间使用,满足了题目的要求。

    上一篇:【剑指offer】面试题32:从上到下打印二叉树(java)
    下一篇:LeetCode笔记:双指针技巧汇总

    发表评论

    最新留言

    不错!
    [***.144.177.141]2026年06月04日 09时53分52秒