LeetCode41. First Missing Positive (陣列技巧)
阿新 • • 發佈:2018-11-20
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.
解法
一開始的解法是開一個大小為n+1的陣列,然後往數組裡面塞數字,然後在遍歷一遍陣列得到結果。這種做法空間複雜度是O(n)。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
vector<bool> arr(n+2, 0);
for(auto num: nums) {
if(num>=1&&num<=n+1)
arr[num]=1;
}
for(int i=1;i<=n+1 ;i++) {
if(arr[i]==false)
return i;
}
}
};
優化下,將操作全都放在nums裡面進行,空間複雜度為O(1)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for(int i=0;i<nums.size();i++) {
int num = nums[ i];
if(num>=1&&num<=n&&nums[i]!=nums[num-1]) {
swap(nums[i], nums[num-1]);
i--;
}
}
for(int i=1;i<=n;i++) {
if(nums[i-1]!=i)
return i;
}
return n+1;
}
};