原题:
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)空间,最难的大概是O(1)空间,因为我们会想当然地使用hash。
但是我要注意,我们需要的hash值不会超过整个数组的长度,所以我们完全可以做到原址hash,也就是把需要hash的值交换到应该在的位置。
比如我们有
1, 2, 3, 5, 7,-1
1. 对于1,2,3,它们是原址的,所以不用hash。
2. 我们遍历到5的时候,可以把它和7交换,5到了该到的位置。
3. 注意我们要接着考察被交换过来的7是否合理,而7由于超过了nums.size(),所以不需要被hash。
4. 最后我们可以考察到所有的值,并且需要被值在1~nums.size()
的数据被放在对应的下标位置。也就是变成了1,2,3,7,5,-1
5. 最后再遍历一遍就可以了。
具体代码如下:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int maxNum = nums.size();
for(int i = 0; i < maxNum; i++){
if(nums[i] <= 0 || nums[i] > maxNum || nums[i] == i + 1 || nums[nums[i]-1] == nums[i])continue;
else{
int temp = nums[i];
nums[i] = nums[nums[i]-1];
nums[temp-1] = temp;
i--;
}
}
for(int i = 0; i < maxNum; i++){
if(i+1 != nums[i])return i+1;
}
return maxNum + 1;
}
};