[LeetCode] 41. First Missing Positive 首个缺失的正数
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