2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。 进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。 力扣448。

答案2021-12-19:

下标循环怼。争取i位置放i+1。 时间复杂度:O(N)。 额外空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    nums := []int{4, 3, 2, 7, 8, 2, 3, 1}
    ret := findDisappearedNumbers(nums)
    fmt.Println(ret)
}

func findDisappearedNumbers(nums []int) []int {
    ans := make([]int, 0)
    if len(nums) == 0 {
        return ans
    }
    N := len(nums)
    for i := 0; i < N; i++ {
        // 从i位置出发,去玩下标循环怼
        walk(nums, i)
    }
    for i := 0; i < N; i++ {
        if nums[i] != i+1 {
            ans = append(ans, i+1)
        }
    }
    return ans
}

func walk(nums []int, i int) {
    for nums[i] != i+1 { // 不断从i发货
        nexti := nums[i] - 1
        if nums[nexti] == nexti+1 {
            break
        }
        nums[i], nums[nexti] = nums[nexti], nums[i]
    }
}

执行结果如下: 图片


左神java代码