First Missing Positive

First Missing Positive 題解


題目描述

First Missing Positive
即從無序的數組中找出第一個缺失的正整數,要求時間複雜度爲O(n),空間複雜度爲O(1)
如:[3,4,-1,1],第一個缺失的正整數爲2數組

題解

能夠利用數組索引來記錄數組出現的正數,即將數組索引號對應正數。具體下來就是將數組array中的x(1<=x<=n)存儲到array[x-1]中。最後從0開始遍歷數組,第一次出現array[i] != i+1,則數組中沒有i這個正整數,也就是數組中第一個缺失的正整數。將x(1<=x<=n)存儲到array[x]中也是隻需遍歷一次數組,因此時間複雜度爲O(n)。而這過程只須要常數個變量就能夠完成替換存儲,因此空間複雜度爲O(1)spa

例如[3,4,-1,1]。則變成[1,-1,3,4],第一個缺失正整數是2code

代碼

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        size_t n = nums.size();
        for (int i = 0; i < n; ) {
            int tmp = nums[i] - 1;
            if (tmp == i || tmp < 0 || tmp >= n || nums[tmp] == tmp + 1) {
                ++i;
            } else {
                nums[i] = nums[tmp];
                nums[tmp] = tmp + 1;
            }

        }
        for (size_t i = 0; i < n; ++i) {
            if (nums[i] != i + 1)
                return i + 1;
        }
        return n + 1;
    }
};

總結

主要應用了索引映射正數這一技巧。索引

相關文章
相關標籤/搜索