题目描述:
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
今日学习:
1.emmmm没有什么特别的
题解:
这道题要是不要求时空复杂度就简单得很,所以题解1是我自己胡乱写的不符合时间要求的
题解2.原地交换数组
题解3.标记数组
var firstMissingPositive = function(nums) {
if(nums.length == 0) return 1
nums = Array.from(new Set(nums)) //不符合要求
nums.sort((a, b) => a - b) //不符合要求
let i = 0
while(nums[i] < 0) {
i++
}
if(nums[i] > 1 || i == nums.length) return 1
for(i; i < nums.length; i++) {
if(i != nums.length - 1) {
if(nums[i + 1] - nums[i] == 1) {
continue
} else {
return nums[i] + 1
}
}else {
return nums[i] + 1
}
}
};
//原地修改数组
const firstMissingPositive = (nums) => {
for (let i = 0; i < nums.length; i++) {
while (
nums[i] >= 1 &&
nums[i] <= nums.length && // 对1~nums.length范围内的元素进行安排
nums[nums[i] - 1] !== nums[i] // 已经出现在理想位置的,就不用交换
) {
const temp = nums[nums[i] - 1]; // 交换
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
// 现在期待的是 [1,2,3,...],如果遍历到不是放着该放的元素
for (let i = 0; i < nums.length; i++) {
if (nums[i] != i + 1) { // 比如 [1,3,4,...]
return i + 1; // 返回 2
}
}
return nums.length + 1; // 发现元素 1~nums.length 占满了数组,一个没缺
};
//标记数组
var firstMissingPositive = function(nums) {
const n = nums.length
for(let i = 0; i < n; i++) {
if(nums[i] <= 0) nums[i] = n + 1
}
for(let i = 0; i < n; i++) {
let num = Math.abs(nums[i])
if(num <= n)
nums[num - 1] = -Math.abs(nums[num - 1])
}
for(let i = 0; i < n; i++) {
if(nums[i] > 0)
return i + 1
}
return n + 1
}