Problem
Given an unsorted integer array, find the smallest missing positive integer.
Note:
Your algorithm should run in O(n) time and uses constant extra space.
Example1
Input: [1,2,0]
Output: 3
Example2
Input: [3,4,-1,1]
Output: 2
Example3
Input: [7,8,9,11,12]
Output: 1
Solution
O(n)的時間複雜度和常數的空間複雜度,所以不能使用額外的哈希表。
所以對於對於nums中在[1,n]的之間的數num,將其映射到nums[num-1]的位置。
然後遍歷nums,找到第一個i+1!=nums[i]的數即可。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for(int i = 0;i<nums.size();++i)
{
//如果nums[i]在[1,n]之間,那就將它放到nums[nums[i] -1]這個位置
//1放在nums[0],2放在nums[1]...以此類推
while(nums[i] >=1 && nums[i] <= n && nums[i] != i+1 && nums[nums[i] - 1] != nums[i])
{
swap(nums[i],nums[nums[i] - 1]);
}
}
for(int i = 0;i<nums.size();++i)
{
if(i+1 != nums[i])
return i+1;
}
return n+1;
}
};