LeetCode刷题之路 整数替换

给定一个正整数 n,你可以做如下操作:

\1. 如果 n 是偶数,则用 n / 2替换 n
\2. 如果 n 是奇数,则可以用 n + 1n - 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)

推荐阅读更多精彩内容