题目描述:
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例:
输入: [1,2,0]
输出: 3
输入: [3,4,-1,1]
输出: 2
输入: [7,8,9,11,12]
输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
解题思路:
1.暴力法
public int firstMissingPositive(int[] nums) {
//先排序
Arrays.sort(nums);
//missing表示预期的下一个缺失的正数
int missing = 1,repeat = 0;
for(int i = 0;i < nums.length;i++){
//小于0的元素不考虑&&!!!与上个正数重复的元素也不考虑
if(nums[i] <= 0 || nums[i] == missing - 1){
continue;
}
//如果nums[i]>0且等于下一个预期的正数
if(nums[i] == missing){
//更新repeat和missing
repeat = missing;
//说明不缺失当前正数,预期的下一个缺失正数是missing+1
missing++;
continue;
}else{
//如果nums[i]>0且不等于下一个预期的正数,那么就相当于缺失这个正数
return missing;
}
}
return missing;
}
2.两次循环遍历,第一次顺序扫描,判断当前数nums[i],若当前数处在0-n-1范围内,且nums[i] != i + 1则寻找与当前数应在位置现在的数nums[nums[i] - 1],若不相等则交换,(易错的是,交换后的这个位置上的新的数还需要接着判断),若相等则break直接扫描下一个数。如此重复下去。第二次顺序遍历的过程中,若发现第一个nums[i] != (i + 1),则返回i + 1即为第一个缺失的正数;否则遍历完都没出现那么答案,返回n + 1即可。
java代码如下: