LeetCode 41. First Missing Positive
Given an unsorted integer array nums
, return the smallest missing positive integer.
You must implement an algorithm that runs in $O(n)$ time and uses constant extra space.
Example 1:
Input: nums = [1,2,0]
Output: 3
Example 2:
Input: nums = [3,4,-1,1]
Output: 2
method
如果正数都有出现,那应该是[1,2,3,...,n]
,index与nums[i]
相互对应nums[i] == i + 1
,不对应就是缺失的最小正数,所以首先要先排序,但是只能用$O(n)$算法,所以只能用置换的方法
把nums[i]
从位置i
换到nums[i] - 1
的位置,首先要保证在[1, n]
的范围内,如果nums[i]
不等于nums[nums[i] - 1]
就交换
当前位置i
的元素换去nums[i]-1
之后,会换回来一个数,这个数如果满足条件的话还要继续换出去,所以要用while
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for (int i = 0; i < n; i++) {
while (nums[i] > 0 && nums[i] <= n && nums[i] != nums[nums[i] - 1]) {
swap(nums[i], nums[nums[i] - 1]);
}
}
for (int i = 0; i < n; i++) {
if (nums[i] != i + 1)
return i + 1;
}
return n + 1;
}