给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 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
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。