循环排序(Cyclic Sort)的进阶应用:寻找缺失的第一个正数
字数 801 2025-10-27 22:12:18

循环排序(Cyclic Sort)的进阶应用:寻找缺失的第一个正数

题目描述:给定一个未排序的整数数组 nums,请找出其中没有出现的最小的正整数。要求算法的时间复杂度为 O(n),并且只能使用常数级别的额外空间。

解题过程:

  1. 问题分析:我们需要找到最小的缺失正整数,这个数字一定在 1 到 n+1 的范围内(n 是数组长度)。如果数组包含了 1 到 n 的所有数字,那么缺失的就是 n+1。

  2. 关键思路:使用循环排序的思想,尝试将每个正整数放到它应该在的位置上。具体来说,如果数字 x 在 1 到 n 的范围内,那么它应该被放在索引 x-1 的位置上。

  3. 算法步骤:

    • 遍历数组中的每个元素
    • 对于当前元素 nums[i],如果它是正整数且在 1 到 n 的范围内,且它不在正确的位置上(即 nums[i] ≠ i+1),且它应该去的位置上的数字不等于它自己,那么就交换它们
    • 重复这个过程直到所有数字都被处理
    • 最后再次遍历数组,找到第一个位置 i 满足 nums[i] ≠ i+1,那么 i+1 就是缺失的最小正整数
  4. 详细示例:对于数组 [3, 4, -1, 1]

    • 第一个元素 3:应该在索引 2 的位置,与索引 2 的 -1 交换 → [-1, 4, 3, 1]
    • 当前元素 -1:不在 1-4 范围内,跳过
    • 第二个元素 4:应该在索引 3 的位置,与索引 3 的 1 交换 → [-1, 1, 3, 4]
    • 当前元素 1:应该在索引 0 的位置,与索引 0 的 -1 交换 → [1, -1, 3, 4]
    • 排序完成后,遍历数组发现 nums[1] = -1 ≠ 2,所以缺失的最小正整数是 2
  5. 边界情况处理:如果数组为空,返回 1;如果数组包含所有 1 到 n 的数字,返回 n+1。

这个算法通过循环排序的思想,在 O(n) 时间复杂度和 O(1) 空间复杂度内解决了问题。

循环排序(Cyclic Sort)的进阶应用:寻找缺失的第一个正数 题目描述:给定一个未排序的整数数组 nums,请找出其中没有出现的最小的正整数。要求算法的时间复杂度为 O(n),并且只能使用常数级别的额外空间。 解题过程: 问题分析:我们需要找到最小的缺失正整数,这个数字一定在 1 到 n+1 的范围内(n 是数组长度)。如果数组包含了 1 到 n 的所有数字,那么缺失的就是 n+1。 关键思路:使用循环排序的思想,尝试将每个正整数放到它应该在的位置上。具体来说,如果数字 x 在 1 到 n 的范围内,那么它应该被放在索引 x-1 的位置上。 算法步骤: 遍历数组中的每个元素 对于当前元素 nums[ i],如果它是正整数且在 1 到 n 的范围内,且它不在正确的位置上(即 nums[ i ] ≠ i+1),且它应该去的位置上的数字不等于它自己,那么就交换它们 重复这个过程直到所有数字都被处理 最后再次遍历数组,找到第一个位置 i 满足 nums[ i ] ≠ i+1,那么 i+1 就是缺失的最小正整数 详细示例:对于数组 [ 3, 4, -1, 1 ] 第一个元素 3:应该在索引 2 的位置,与索引 2 的 -1 交换 → [ -1, 4, 3, 1 ] 当前元素 -1:不在 1-4 范围内,跳过 第二个元素 4:应该在索引 3 的位置,与索引 3 的 1 交换 → [ -1, 1, 3, 4 ] 当前元素 1:应该在索引 0 的位置,与索引 0 的 -1 交换 → [ 1, -1, 3, 4 ] 排序完成后,遍历数组发现 nums[ 1 ] = -1 ≠ 2,所以缺失的最小正整数是 2 边界情况处理:如果数组为空,返回 1;如果数组包含所有 1 到 n 的数字,返回 n+1。 这个算法通过循环排序的思想,在 O(n) 时间复杂度和 O(1) 空间复杂度内解决了问题。