给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
class Solution {
private void swap(int[] nums,int i, int k){
int temp = nums[i];
nums[i] = nums[k];
nums[k] = temp;
}
public int firstMissingPositive(int[] nums) {
//方法1,先排序,再用二分法,时间复杂度O(nlogn)空间复杂度O(1)
//方法2,把无序数组存入哈希表,然后在遍历哈希表。时间复杂度O(n),空间复杂度O(n)
//方法3,原地哈希法,把i个元素放在第nums[i]-1个位置上,再遍历一遍找到缺失的数字
int len = nums.length;
for(int i=0;i<len;i++){//nums[nums[i]-1]查看第i个元素的值是否放正确
while(nums[i]<len&&nums[i]>0&&nums[i]!=nums[nums[i]-1]){
//当前数>0才需要排序,<len才可以放进当前的数组中,此处用while复杂度不会高,因为均摊复杂度
//swap交换i个元素放在第nums[i]-1个位置上,此时需要再次比对
//当前i个位置交换后的数是否正确,如果不对需要重复
swap(nums,i,nums[i]-1);
}
}
for(int j=0;j<len;j++){
if(j+1!=nums[j]){
return j+1;
}
}
//全都遍历没有问题那么缺失的数字为当前数组最大的数len+1;
return len+1;
}
}
原文:https://www.cnblogs.com/ScarecrowAnBird/p/13047828.html