1. 程式人生 > >LeetCode-041 First Missing Positive

LeetCode-041 First Missing Positive

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; } };