Given an unsorted integer array nums. Return the smallest positive integer that is not present in nums.
You must implement an algorithm that runs in O(n) time and uses O(1) auxiliary space.
給定一個為排序的整數陣列 nums,回傳陣列nums中沒有出現的最小正整數。
你必須實現的演算法,該算法的時間複雜度為 O(n),並且使用 O(1) 的輔助空間。
[註]「使用 O(1) 的輔助空間」的意思就是不能使用額外的陣列或list來儲存資料。
解題思路
先來看題目,從題目提供的範例可以觀察到以下幾點:
總結來說,只要在陣列中把每個正整數放到對應的索引位置,也就是利用Cyclic Sort(循環排序),例如:正整數6就放到索引值5的位置(請注意正整數值與索引值之間對應的關係,索引值 = 正整數值 - 1
),然後比對陣列中每個索引值對應的正整數值是否正確,若不正確,表示找到了不存在的正整數,並回傳該索引值。
步驟
程式碼
var firstMissingPositive = function(nums) {
const n = nums.length;
// 將每個數字放到正確的位置上
for (let i = 0; i < n; ++i) {
while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] !== nums[i]) {
// 交換nums[i]和它應該在的正確位置上的值
let correctIndex = nums[i] - 1;
[nums[i], nums[correctIndex]] = [nums[correctIndex], nums[i]];
}
}
// 找到第一個和對應索引值不同的正整數
for (let i = 0; i < n; ++i) {
if (nums[i] !== i + 1) {
return i + 1;
}
}
// 如果陣列中所有的正整數都在正確的位置上,回傳 n+1
return n + 1;
};