描述
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
分析
把值在1到n之间的元素移动到下标等于值减去1的位置,这样做就能把现有的元素都移动到他自身的位置,从头再遍历数组,若遇到下标+1不等于值得情况,则第一个缺失得正整数就是i+1。
注意交换之后要一直交换当前位置上得元素,直到他不再变化。
class Solution {
public int firstMissingPositive(int[] nums) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0 && nums[i] <= nums.length) {
int tmp = nums[i];
sweep(nums,nums[i]-1,i);
if (tmp == nums[i]) {
i++;
}
i--;
}
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] != i + 1) {
return i+1;
}
}
return nums.length + 1;
}
public void sweep (int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}