41. 缺失的第一个正数(难度困难)
题目链接:https://leetcode-cn.com/problems/first-missing-positive/
题目链接:
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
解法一:利用数组的下标
我们分析题目不难发现,没有出现的最小正整数一定是小于等于数组长度+1的。
我们只需要创建一个整数数组a,长度为nums数组长度+1,然后我们遍历一遍数组nums,将 nums[i] > 0 并且 小于 nums数组长度+1的元素,作为 a数组的下标,并且标记a[nums[i]] = 1,当遍历完成之后,我们只需要再遍历一遍数组a,找到第一个等于0的元素,他的下标就是问题的结果,即没有出现的最小正整数。
代码:
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
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;
}
}