跳转至

LC41 - 缺失的第一个正数

FirstMissingPositive.go
package Array

// 双指针解法, 时间复杂度: O(n), 空间复杂度: O(1)
func firstMissingPositive(nums []int) int {
    size := len(nums)
    l, r := 0, size
    // nums[0...l-1] -> 1 2 3 ... l, 表示已归位的部分
    // nums[r...size-1] -> 表示垃圾区,同时表示在最好情况下1-r这些数字可以全部收集
    for l < r {
        if nums[l] == l+1 {
            // (1) 已归位 -> 继续判断下一个位置
            l++
        } else if nums[l] <= l || nums[l] > r || nums[nums[l]-1] == nums[l] {
            // (2) 已越界或目标位置上的数字已归位 -> 将当前数字分配到垃圾区
            nums[l], nums[r-1] = nums[r-1], nums[l]
            r--
        } else {
            // (3) 一般情况 -> 将当前数字与目标位置上的数字进行交换
            nums[l], nums[nums[l]-1] = nums[nums[l]-1], nums[l]
        }
    }
    return l + 1
}

MEX问题,注释已经写得很清楚,强推左神算法讲解