即從無序的數組中找出第一個缺失的正整數,要求時間複雜度爲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]
,第一個缺失正整數是2
。code
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; } };
主要應用了索引映射正數這一技巧。索引