题目:
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间
我的答案:
第一个想法是先排序,但是时间复杂度达不到,就看到一个想法:
遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,然后再遍历一次数组查当前下标是否和值对应,如果不对应那这个下标就是答案,否则遍历完都没出现那么答案就是数组长度加1。
然后就写了代码:
class Solution {
public int firstMissingPositive(int[] nums) {
if(nums==null||nums.length==0){
return 1;
}
int i=0;
while(i<nums.length){
if(nums[i]>0&&nums[i]<=nums.length){
int index = nums[i];
if(index==nums[index-1]){
i++;
}else{
nums[i] = nums[index-1];
nums[index-1] = index;
}
}else{
i++;
}
}
for(int j=0;j<nums.length;j++){
if(nums[j]!=j+1){
return j+1;
}
}
return nums.length+1;
}
}
题解:
官方题解: