缺失的第一个正数
func firstMissingPositive(nums []int) int {
n := len(nums)
// left: left 左侧已归位
// right: right 右侧为垃圾区
// 归位: [1, 2, 3, ...],即:nums[i] == i + 1
left, right := 0, n - 1
for left <= right {
if nums[left] == left + 1 { // 已归位
left++
} else if nums[left] < left + 1 { // 垃圾
nums[left], nums[right] = nums[right], nums[left]
right--
} else if nums[left] - 1 > left && nums[left] - 1 <= right {
// 要放的位置已经是正确的值了,那么当前值就是垃圾
if nums[nums[left] - 1] == nums[left] {
nums[left], nums[right] = nums[right], nums[left]
right--
} else {
// 放到正确的位置
nums[left], nums[nums[left] - 1] = nums[nums[left] - 1], nums[left]
}
} else { // 垃圾
nums[left], nums[right] = nums[right], nums[left]
right--
}
}
return left + 1
}