Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0] Output: 3
Example 2:
Input: [3,4,-1,1] Output: 2
Example 3:
Input: [7,8,9,11,12] Output: 1
Note:
Your algorithm should run in O(n) time and uses constant extra space.
给一个没排序的整数数组,找出缺失的最小的正整数。
解法:
Java:
public class Solution {
public int firstMissingPositive(int[] A) {
int i = 0;
while(i < A.length){
if(A[i] == i+1 || A[i] <= 0 || A[i] > A.length) i++;
else if(A[A[i]-1] != A[i]) swap(A, i, A[i]-1);
else i++;
}
i = 0;
while(i < A.length && A[i] == i+1) i++;
return i+1;
}
private void swap(int[] A, int i, int j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
Python: wo
class Solution(object):
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
mx = 0
flag = set()
for n in nums:
if n > mx:
mx = n
flag.add(n)
i = 1
while i < mx:
if i not in flag:
return i
i += 1
return mx + 1
Python:
class Solution:
# @param A, a list of integers
# @return an integer
def firstMissingPositive(self, A):
i = 0
while i < len(A):
if A[i] > 0 and A[i] - 1 < len(A) and A[i] != A[A[i]-1]:
A[A[i]-1], A[i] = A[i], A[A[i]-1]
else:
i += 1
for i, integer in enumerate(A):
if integer != i + 1:
return i + 1
return len(A) + 1
C++:
// NOT constant space
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int mx = 0;
unordered_set<int> s;
for (int num : nums) {
if (num <= 0) continue;
s.insert(num);
mx = max(mx, num);
}
for (int i = 1; i <= mx; ++i) {
if (!s.count(i)) return i;
}
return mx + 1;
}
};
C++:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for (int i = 0; i < n; ++i) {
while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
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;
}
};
类似题目:
Missing Number
Find the Duplicate Number
Find All Numbers Disappeared in an Array
Couples Holding Hands