题目描述
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
golang代码实现:
func firstMissingPositive(nums []int) int {
if len(nums) == 0{
return 1
}
lens := len(nums)
for i := 0; i <lens; i++{
if nums[i] <= 0{
nums[i] = lens + 1
}
}
for i := 0; i < lens; i++{
num := abs(nums[i])
if num <= lens{
nums[num-1] = -abs(nums[num-1])
}
}
var missNum int
for missNum = 0; missNum < lens; missNum++{
if nums[missNum] > 0{
return missNum + 1
}
}
missNum += 1
return missNum
}
func abs(num int)int{
if num < 0{
return -num
}else{
return num
}
}
题目分析:
由于限制了时间复杂度和空间复杂度,不能新建hash获取缺失的正数。但是如果在原有数组上改造建立新数组。借助官方解题的标记法。
1、缺失的数字在1-(N+1),将小于等于0的全部变为 N+1
2、将属于1-N的值将其对应的下标上的值改为负数,这样所有的值都标记完了
3、顺序遍历数组,得到第一个正数的值其下标+1,就是缺失的最小正整数。
题目来源:https://leetcode-cn.com/problems/first-missing-positive/