LeetCode-041 First Missing Positive
阿新 • • 發佈:2019-02-06
Description
Given an unsorted integer array, find the smallest missing positive integer.
Example
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.
Analyse
真的是越短的題目越難,而且這道題的描述,是有點問題的(我覺得)。題目直譯就是,給定一個未排序的陣列,找出最小的丟失的正整數。一直搞不懂,這個丟失是什麼意思。看了很久,終於看懂了,就是讓你在所有正整數裡面,除去陣列給出正整數,裡面最小的那個是什麼,也就說數組裡面缺了哪些正整數,然後在那些正整數裡面找出最小的。
好了,題意弄懂了,然後後面還有要求,要求你的演算法的時間複雜度為O(n),空間複雜度為O(1),這就是難度所在了,假如沒有這個條件,我們很容易想到,用一個空陣列來代表正整數出現的情況,然後在裡面從小往大找第一個沒出現的就好了,但是問題是不能再做多一個數組。那麼。。我們用原來的陣列進行操作就好了啊,用交換來完成讓數字跟索引相匹配,不匹配的那一個就是沒出現的正整數。每次迴圈保證i索引下的數字nums[i]能放到正確的位置,直到那個數字不在範圍內。
Code
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for (int i=0;i<nums.size();i++) {
while (nums[i]>0 && nums[i]<=nums.size() && nums[nums[i]-1]!=nums[i]) {
swap(nums[i],nums[nums[i]-1]);
}
}
for (int i=0;i<nums.size();i++) {
if (nums[i]!=i+1) return i+1;
}
return nums.size()+1;
}
};