41. 缺失的第一个正数

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

提示:

你的算法的时间复杂度应为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