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)的时间完成
这个题是真的没做出来,自己的代码写的很撒比,看了一下discuss真是服气
最重要的一点是要明白缺的那个数一定是小于等于数组的size的!
一共就这么长的一个数组,缺的那个数最大也是在最后,而且还得是它从1-n排列好的情况下,否则,缺的就是中间的某个数了,而且就会小于size。
想明白这个问题之后就是对数组进行排列了,我们只需要排列其中的正整数即可,就是把可以排列的正整数排到它应该呆的地方去。
比如对于数组a[5]=【-1,2,3,1,5】
1应该呆在a[0]这个位置
2呆在a[1] 3呆在a[2] 5这个数就超出索引范围了,因此不动就行,这样排好后最后的样子差不多是这样的
【1,2,3,-1,5】
然后这样就能一眼看出来答案是“不在位置的数”了。
代码如下:(是我从discuss上参考的代码)
class Solution {
public:int firstMissingPositive(vector<int>& nums) {for(int i=0; i<nums.size(); i++){if(i+1==nums[i]) continue;int x = nums[i];while(x>=1 && x<=nums.size() && x!=nums[x-1]){//这段就是在排列正确的数swap(x, nums[x-1]);}}for(int i=0; i<nums.size(); i++){if(i+1!=nums[i]) return i+1;}return nums.size()+1;}
};