缺失的第一个正数
理解题目:
题目要求在未排序的整数数组中找到缺失的第一个正数。缺失的第一个正数指的是大于 0 并且不在数组中的最小正整数。
代码实现:
public class FirstMissingPositive {
// 缺失的第一个正数
public int firstMissingPositive(int[] nums) {
int n = nums.length;
// 将非正数置为 n + 1
for (int i = 0; i < n; i++) {
if (nums[i] <= 0) {
nums[i] = n + 1;
}
}
// 标记出现过的正数
for (int i = 0; i < n; i++) {
int num = Math.abs(nums[i]);
if (num <= n) {
nums[num - 1] = -Math.abs(nums[num - 1]);
}
}
// 找到第一个正数的索引,即为缺失的第一个正数
for (int i = 0; i < n; i++) {
if (nums[i] > 0) {
return i + 1;
}
}
return n + 1;
}
}
步骤解释:
-
将数组中所有非正数置为 n + 1,其中 n 是数组的长度。这样,所有不在 1 到 n 范围内的数都变为了 n + 1。
-
遍历数组,对于每个出现过的正数 x,将索引为 x - 1 的位置的数置为负数,表示 x 已经出现过。
-
再次遍历数组,找到第一个正数的索引,即为缺失的第一个正数。如果数组中没有正数,则缺失的第一个正数为 n + 1。
时间复杂度: 遍历数组三次,时间复杂度为 O(n)。
空间复杂度: 只使用了常数级别的额外空间,空间复杂度为 O(1)。