First Missing Positive
Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.Your algorithm should run in O(n) time and uses constant space.
数组哈希法
复杂度
O(N) 时间 O(1) 空间
思路
这道题先得理解深刻,再做
对于一个数组,长度为n,我们在最后返回的答案肯定是[1,n+1]闭区间范围内,超出这个区间不可能是答案,跳过即可
我们要做的就是,两步走:
1.把数组中有可能是答案的数([1,n+1]闭区间内的数)放在正确的位置上:num放在下标为num-1的位置上,比如4放在下标为3的位置上,注意有可能是答案的数才放,此时不会数组越界。
2.最后在这些可能的位置上找答案,这些位置是0到n-1。
举几个例子:
[5,6,7],答案:1
[5],答案:1
[-5],答案:1
[0],答案:1
[1],答案:2
[2,2],答案:1
注意最后这个例子,对于第一个2,这个数在答案区间内,可是我们发现在他应该出现的位置上已经是他了,那么我们视当前这个位置的2不是答案,跳过这个。这个特例需要注意哟~
注意
注意[2,2]这种情况哟
代码
public class Solution {
public int firstMissingPositive(int[] nums) {
for (int i = 0; i < nums.length; ) {
int n = nums[i];
if (n >= 1 && n <= nums.length + 1 && nums[n - 1] != n) {//这个数在答案区间
int tmp = nums[n - 1];
nums[n - 1] = n;
nums[i] = tmp;
} else { //不在答案区间跳过不管
i++;
}
}
for (int i = 1; i < 1 + nums.length; i++) {
if (nums[i - 1] != i)
return i;
}
return nums.length + 1;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。