397. 整数替换

最开始的思路,使用动态规划
但可以发现其数据了达到2**31所以不能这样做
# def fun1(n):
#     if n&1:  #奇数则不为0
#         dp=[float("inf") for i in range(n+2)]
#         dp[n]=0
#         dp[n+1]=1
#     else:
#         dp=[float("inf") for i in range(n+1)]
#         dp[n]=0
#     for i in range(n-1,0,-1):  #从n-1到1
#         if i&1:  #奇数
#             if i*2>
#             dp[i]=min(dp[i-1],dp[i+1],dp[i*2])
#         else:
# fun1(8)
采用递归的方式
这里有一个巧妙的地方在于当当前数位奇数时
其-1+1为偶数,可以直接进行整除2的操作,是的代码被大大化简
值得注意的是是在递归的过程中进行添加
def fun2(n):
    def digui(i):
        if i==1:
            return 0
        if i&1:#奇数
            return 2+min(digui((i-1)//2),digui((i+1)//2))
        else:
            #偶数
            return 1+digui(i//2)
    return digui(n)
print(fun2(8))

在fun2的基础上采用记忆化的方式,使得重复计算可以不再重复算
from functools import lru_cache

def fun3(n):
    @lru_cache(None, False)  #可能会出现重复计算,所以采用记忆化递归
    def digui(i):
        if i==1:
            return 0
        if i&1:#奇数
            return 2+min(digui((i-1)//2),digui((i+1)/2))
        else:
            #偶数
            return 1+digui(i//2)
    return digui(n)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值