题目:
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
提示:
1 <= nums.length <= 5 * 10^5
-2^31 <= nums[i] <= 2^31 - 1
解法1:置换
/**
* 思路:
* 数组最后一定返回的是1到len中的某一个数(想清楚这个事,这个题就简单了)
* 值超过数组的长度和小于等于0的数。一定不是我们最后要的
* 遍历数组,如果一个数num是我们最终要的,就把num放到num-1的下标位置
* 之后交换num-1位置上的值,重复上面的过程
* 看这个新交换的值是否是我们需要的,如果不是就不必重复这个过程
* 如果新交换的值恰好等于当前位置+1,说明放到了正确位置,也不必重复这个过程
* 结束完这个过程后,每个位置都放上了正确的值,如果某个位置不是正确的值说明这个位置的下标+1就是我们要找的最小正整数
* 如果位置全部正确,就返回len+1
*/
public static int firstMissingPositive(int[] nums) {
int len = nums.length;
for (int i = 0; i < len; i++) {
while (nums[i] <= len && nums[i] > 0) {
int final_index = nums[i] - 1;
if (nums[final_index] != final_index + 1) {
int tmp = nums[final_index];
nums[final_index] = nums[i];
nums[i] = tmp;
} else {
break;
}
}
}
for (int i = 0; i < len; i++) {
if (nums[i] != i + 1) {
return i + 1;
}
}
return len + 1;
}
时间复杂度:On
空间复杂度:O1