给定一个正整数 n,你可以做如下操作:
\1. 如果 n 是偶数,则用 n / 2
替换 n。
\2. 如果 n 是奇数,则可以用 n + 1
或n - 1
替换 n。
n 变为 1 所需的最小替换次数是多少?
示例 1:
输入:
8
输出:
3
解释:
8 -> 4 -> 2 -> 1
示例 2:
输入:
7
输出:
4
解释:
7 -> 8 -> 4 -> 2 -> 1
或
7 -> 6 -> 3 -> 2 -> 1
解题思路
这道题主要在于n是奇数的时候,在这里我们选用递归的方法返回n+1和n-1两种情况下的替换次数的最小值,出口就设置n为1的时候替换次数为0。另外,为了算法更加高效,我们创建了一个字典,将递归求出的n值和替换次数作为键值对保存在字典中,防止多次重复计算。以下就是这道题的代码:
class Solution:
def integerReplacement(self, n):
"""
:type n: int
:rtype: int
"""
allreplc = {}
def replc(n):
if n == 1:
return 0
if allreplc.get(n) is not None :
return allreplc[n]
if n % 2 :
allreplc[n] = min(replc(n - 1),replc(n + 1)) + 1
return allreplc[n]
else:
return replc(n / 2) + 1
return replc(n)