代码 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
}