整数替换——贪心

57 阅读1分钟

image.png

代码 1 递归枚举所有情况:

先除 2 再加 1 ,防止 n + 1 越界

func integerReplacement(n int) int {
    if n == 1 {
        return 0
    }
    if n%2 == 0 {
        return 1 + integerReplacement(n/2)
    }
    return 2 + min(integerReplacement(n/2), integerReplacement(n/2+1))
}

func min(a, b int) int {
    if a > b {
        return b
    }
    return a
}

代码 2 记忆化搜索:

代码 1 的优化,记录递归情况

var memo map[int]int

func _integerReplacement(n int) (res int) {
    if n == 1 {
        return 0
    }
    if res, ok := memo[n]; ok {
        return res
    }
    defer func() { memo[n] = res }()
    if n%2 == 0 {
        return 1 + _integerReplacement(n/2)
    }
    return 2 + min(_integerReplacement(n/2), _integerReplacement(n/2+1))
}

func integerReplacement(n int) (res int) {
    memo = map[int]int{}
    return _integerReplacement(n)
}

func min(a, b int) int {
    if a > b {
        return b
    }
    return a
}

代码 3 贪心:

......

func integerReplacement(n int) (ans int) {
    for n != 1 {
        switch {
        case n%2 == 0:
            ans++
            n /= 2
        case n%4 == 1:
            ans += 2
            n /= 2
        case n == 3:
            ans += 2
            n = 1
        default:
            ans += 2
            n = n/2 + 1
        }
    }
    return
}