缺失的第一個正數
1.題目
給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。
示例 1
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
提示:
- 你的算法的時間複雜度應爲O(n),並且只能使用常數級別的額外空間。
題目模板
/**
* @param {number[]} nums
* @return {number}
*/
var firstMissingPositive = function(nums) {
};
2.思路分析
見題解
3.所用到的方法
見題解
4.題解及優化
我的題解
let firstMissingPositive = nums => {
if (!nums.length) nums = [0] // 避[]
nums.sort((a, b) => a - b)
// +1避免i取不到類似[1,2,3]的結果4
for (let i = 1; i <= nums.length + 1; i++) {
if (!nums.includes(i)) {
return i
}
}
return 0 // 謹慎起見可加
}
課程解法
let firstMissingPositive = nums => {
// 過濾掉非正整數
nums = nums.filter(item => item > 0)
// 正整數數組是不是爲空
if (nums.length) {
// 升序,方便從左到右取最小值arr[0]
nums.sort((a, b) => a - b)
// 如果第一個元素不爲1,返回1
if (nums[0] !== 1) {
return 1
} else {
// 從左邊開始遍歷,只要下一個元素和當前元素差值>1說明當前元素的下一個值(+1)
for (let i = 0; i < nums.length - 1; i++) {
if (nums[i + 1] - nums[i] > 1) {
return nums[i] + 1
}
}
// 如果數組是連續的正整數[1,2,3,4,5,6]
return nums.pop() + 1
}
} else {
return 1
}
}
使用選擇排序:
let firstMissingPositive = nums => {
nums = nums.filter(item => item > 0)
// 實現選擇排序,先拿到最小值,如果第一個元素不是1直接返回1,如果是1,就要比相鄰元素差值
for (let i = 0, len = nums.length, min; i < len; i++) {
min = nums[i]
for (let j = i + 1; j < len; j++) {
if (nums[j] < min) {
let c = min
min = nums[j]
nums[j] = c
}
}
nums[i] = min
if (i > 0) {
if (nums[i] - nums[i - 1] > 1) {
return nums[i - 1] + 1
}
} else {
if (min !== 1) {
return 1
}
}
}
return nums.length ? nums.pop() + 1 : 1
}
其他小夥伴的解法
拓展: