题目:
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0] 输出: 3
示例 2:
输入: [3,4,-1,1] 输出: 2
示例 3:
输入: [7,8,9,11,12] 输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
最近项目忙,难得有心情抽空刷一题Leetcode(发现还是一题困难= =,脑阔疼)。
思路:
这个题目有点蛋疼,卡了我挺久的。一开始想进行各种边界判断,发现太复杂了。小小参考了一下别人的思路,嗯嗯,恍然大悟。。
运用到的方法有点类似木桶法,将nums[i]的值放在i-1的位置(也就是说1放在0的位置,2放在1的位置,当查询到nums[i]!=i-1的时候,这个数就是缺失的)。很巧妙,学到了。
贴上代码:
public class Solution {
public int firstMissingPositive(int[] nums) {
if(nums.length == 0)
return 1;
//第i位存放i+1的数值
for(int i = 0; i < nums.length;i++){
if(nums[i] > 0){
while(nums[i] > 0 && nums[i] < i+1 &&nums[i] != nums[nums[i] -1]){ //小于i+1是为了超出数组边界
int temp = nums[nums[i]-1];//交换数据
nums[nums[i]-1] = nums[i];
nums[i] = temp;
}
}
}
//循环寻找不符合要求的数据,返回
for(int i = 0; i < nums.length;i++){
if(nums[i] != i+1){
return i+1;
}
}
return nums.length + 1;
}
}
只有while的循环条件可以具体说一下,nums[i]>0和nums[i]!=nums[nums[i]-1]就没什么好说了,小于0或者相等的时候就不用调这个方法了,直接跳过。num[i]<i+1,是为了控制当前数只能向前交换,防止数组超边界。
结果如下: