概述
目的是找到一个int数组中第一个丢失的正整数。
结果
Input: [3, 2, -2]
Output: 1
Input: [7, 8, 9, 11, 12]
Output: 1
Input: [1, 2, 3]
Output: 4
如果数组中存在与该索引相等的数字,我们可以使该数组的索引为负数。对于这个问题,零和负数并不重要,所以我们把正数放在一边,零/负数放在另一边。
然后我们只对正数采取行动,并遵循以下方法。
-
我们在数组中进行迭代。对于当前元素x,我们把arr[x-1] 的值改为负数。
-
最后,我们遍历并返回仍然是正数的索引。如果所有的索引都是负的,那么我们返回
total_num_of_positive_int + 1
程序
下面是同样的程序
package main
import (
"fmt"
"math"
)
func main() {
output := firstMissingPositive([]int{3, 2, -2})
fmt.Println(output)
output = firstMissingPositive([]int{-3, -2, -1})
fmt.Println(output)
output = firstMissingPositive([]int{7, 8, 9, 11, 12})
fmt.Println(output)
output = firstMissingPositive([]int{1, 2, -1})
fmt.Println(output)
output = firstMissingPositive([]int{1, 2, 3})
fmt.Println(output)
output = firstMissingPositive([]int{1, 1})
fmt.Println(output)
}
func firstMissingPositive(nums []int) int {
onlyPositiveNumsArray, k := segregate((nums))
for i := 0; i < k; i++ {
value := int(math.Abs(float64(onlyPositiveNumsArray[i])))
if value > 0 && value <= k {
if onlyPositiveNumsArray[value-1] > 0 {
onlyPositiveNumsArray[value-1] = -1 * onlyPositiveNumsArray[value-1]
}
}
}
for i := 0; i < k; i++ {
if onlyPositiveNumsArray[i] > 0 {
return i + 1
}
}
return k + 1
}
func segregate(nums []int) ([]int, int) {
k := 0
for i := 0; i < len(nums); i++ {
if nums[i] > 0 {
nums[k] = nums[i]
k++
}
}
return nums[0:k], k
}
输出
1
1
1
3
4
2