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

示例 1:

输入: [1,2,0]
输出: 3
示例 2:

输入: [3,4,-1,1]
输出: 2
示例 3:

输入: [7,8,9,11,12]
输出: 1
说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

先用HashSet记录所有正数的值,从1开始找,最差情况就是第n个都是

public int firstMissingPositive(int[] nums) {
    Set<Integer> set=new HashSet();
    for(int i:nums){
        if(i<=0) continue;
        set.add(i);
    }
    for(int i=0;i<set.size();i++){
        if(!set.contains(i+1)) return i+1;
    }
    return set.size()+1;
}

想法是先找到正数里的最小值,如果最小值不是1就是1,并记录所有正数比他打多少,然后在比他大多少的数组里,找到第一个非从1开始的递增数列的数,做到一半发现个问题,在极端情况下,复杂度还是n方

错误的
public int firstMissingPositive(int[] nums) {
    if(nums==null || nums.length<=0) return 0;
    int min=nums[0];
    List<Integer> list=new ArrayList();
    for(int i=1;i<nums.length;i++){
        if(nums[i]<=0) continue;
        min=Math.min(min,nums[i]);
    }
    if(min!=1) return 1;
    for(int i:nums){
        if(i==min || i<=0) continue;
        list.add(i-min);
    }
    for(int i 
}

程浩
21 声望2 粉丝

下一篇 »
42. 接雨水