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
Approach 01:
-
C++
-
Python
#include <bits/stdc++.h> using namespace std; class Solution { public: int firstMissingPositive(vector<int>& nums) { unordered_map<int,int> mp; for(auto &it: nums){ mp[it] = 1; } int n = mp.size(); for(int i=1; i<n+2; i++){ if(mp[i] != 1){ return i; } } return -1; } };
from typing import * import collections class Solution: def firstMissingPositive(self, nums: List[int]) -> int: d = collections.Counter(nums) i = 0 for i in range(1,len(d)+2): if(d.get(i) == None): return i return -1
Time Complexity:
Building the Counter: This operation takes O(n)
time, where n
is the number of elements in the nums
list.
For Loop: The range of the loop runs from 1 to len(d) + 1
. In the worst case, len(d) = n
, so the loop will iterate up to n + 1
times. Each iteration performs a dictionary get
operation, which is O(1)
on average.
Combining these, the total time complexity is O(n)
.
Space Complexity:
Space for the Counter: In the worst case, the Counter will store each element as a key, requiring O(n)
space.
Additional variables take O(1)
space.
Combining these, the total space complexity is O(n)
.