在Go中寻找int数组中第一个丢失的正整数(Golang)

84 阅读1分钟

概述

目的是找到一个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