普通数组

缺失的第一个正数

困难#41Java时间 O(n)空间 O(1)

题目要做什么

给定无序整数数组,在线性时间、常数额外空间内找出最小缺失的正整数。

题目示例输入nums = [3,4,-1,1]
题目示例输出2

01 为什么这样做

长度为 n 的数组,答案一定在 1 到 n+1 之间。把合法值 x 放到下标 x−1,重复值已经归位时停止交换。最后第一个 nums[i] != i+1 的位置就是答案。

始终成立的条件

交换会让至少一个合法值归位;已经放在正确位置的值不会被移走。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public int firstMissingPositive(int[] nums) {3        int n = nums.length;4        for (int i = 0; i < n; i++) {5            while (nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {6                int destination = nums[i] - 1;7                int temp = nums[destination];8                nums[destination] = nums[i];9                nums[i] = temp;10            }11        }12        for (int i = 0; i < n; i++) {13            if (nums[i] != i + 1) return i + 1;14        }15        return n + 1;16    }17}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索