给定一个正整数 n ,你可以做如下操作:
如果 n 是偶数,则用 n / 2替换 n 。
如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。
返回 n 变为 1 所需的 最小替换次数 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/integer-replacement
例:
输入:n = 8 输出:3 解释:8 -> 4 -> 2 -> 1
解析:
这里偶数是肯定对半折的,奇数到底是加一还是减一,主要是看奇数操作后的值能否更多的对半折,所以可以使用回溯。找出对折占比对多,操作最少的那一条路线即可。
class Solution(object):
def integerReplacement(self, n):
"""
:type n: int
:rtype: int
"""
def jisuan(n): # 计算函数
if n == 1: # 终止条件
return 0
if (n % 2 == 0):
return 1 + jisuan(n/2) # 调用自己,本次操作加之后的操作
else:
return 1 + min(jisuan(n+1), jisuan(n-1)) # 挑选出操作次数最少的一次
return jisuan(n) # 执行函数