41. First Missing Positive
Given an unsorted integer array nums
. Return the smallest positive integer that is not present in nums
.
You must implement an algorithm that runs in O(n)
time and uses O(1)
auxiliary space.
Example 1:
Input: nums = [1,2,0]
Output: 3
Explanation: The numbers in the range [1,2] are all in the array.
Example 2:
Input: nums = [3,4,-1,1]
Output: 2
Explanation: 1 is in the array but 2 is missing.
Example 3:
Input: nums = [7,8,9,11,12]
Output: 1
Explanation: The smallest positive integer 1 is missing.
Constraints: โ
1 <= nums.length <= 105
-231<= nums[i] <= 231- 1
Solution
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
auto it = std::partition(nums.begin(), nums.end(), [](int x) {return x <= 0;});
if (it == nums.end()) return 1;
long long int si = it-nums.begin();
for (int idx = si; idx < nums.size(); idx++) {
int absv = abs(nums[idx]);
if (si + absv - 1 < nums.size())
nums[si + absv - 1] = -1 * abs(nums[si + absv - 1]);
}
for (int idx = si; idx < nums.size(); idx++) {
if (nums[idx] > 0)
return idx - si + 1;
}
return nums.size() - si + 1;
}
};