Description
Given an unsorted integer array, find the smallest missing positive integer.
Example
Example 1:
Input: [1,2,0]
Output: 3
Example 2:
Input: [3,4,-1,1]
Output: 2
Example 3:
Input: [7,8,9,11,12]
Output: 1
Note
Your algorithm should run in O(n) time and uses constant extra space.
Analyse
真的是越短的题目越难,而且这道题的描述,是有点问题的(我觉得)。题目直译就是,给定一个未排序的数组,找出最小的丢失的正整数。一直搞不懂,这个丢失是什么意思。看了很久,终于看懂了,就是让你在所有正整数里面,除去数组给出正整数,里面最小的那个是什么,也就说数组里面缺了哪些正整数,然后在那些正整数里面找出最小的。
好了,题意弄懂了,然后后面还有要求,要求你的算法的时间复杂度为O(n),空间复杂度为O(1),这就是难度所在了,假如没有这个条件,我们很容易想到,用一个空数组来代表正整数出现的情况,然后在里面从小往大找第一个没出现的就好了,但是问题是不能再做多一个数组。那么。。我们用原来的数组进行操作就好了啊,用交换来完成让数字跟索引相匹配,不匹配的那一个就是没出现的正整数。每次循环保证i索引下的数字nums[i]能放到正确的位置,直到那个数字不在范围内。
Code
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for (int i=0;i<nums.size();i++) {
while (nums[i]>0 && nums[i]<=nums.size() && nums[nums[i]-1]!=nums[i]) {
swap(nums[i],nums[nums[i]-1]);
}
}
for (int i=0;i<nums.size();i++) {
if (nums[i]!=i+1) return i+1;
}
return nums.size()+1;
}
};