O(n) O(1)
Intuition
Place each number i at index i-1. Then scan for the first index where nums[i] != i+1.
Explanation
Approach
- For each nums[i] in range [1, n], swap it to position nums[i]-1.
- Scan array: first index where nums[i] != i+1 is the answer.
- If all match, answer is n+1.
Complexity
- Time: O(n)
- Space: O(1)
Implementation
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for (int i = 0; i < n; i++) {
while (nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
for (int i = 0; i < n; i++) {
if (nums[i] != i + 1) {
return i + 1;
}
}
return n + 1;
}
}