LeetCode第6365题-将整数减少到零需要的最少操作数-python实现-图解思路与手撕代码

LeetCode第6365题-将整数减少到零需要的最少操作数-python实现-图解思路与手撕代码


一、题目描述

。

二、解题思路与代码实现

1.解题思路

这道题涉及2的幂指数。从二进制的角度来思考比较方便。
比如n=39=00100111,最低位1所代表的数字是1,(第二个最低位1代表的数字是00000010=2,第四个最低位1代表的数字是00100000=32),如果加一,n+1=40=00101000,然后分别减去8和32,只需要操作4次即可。
什么时候加上什么时候减去我们可以用递归的方法全部考虑一遍,这样解题的流程就是,先找到最低位的1,分别计算加上和减去所需要的操作次数,返回两者的最小值。

2.代码实现

代码如下(示例):

@cache
# 记忆化搜索,标注一个@cache
def dfs(n:int) -> int:
    # 如果输入的数已经是2的幂指数,那就只需要一步操作,则返回1
    # 如n=4=100,n-1=3=011,此时n & (n-1) == 0,返回1
    if n & (n-1) == 0:return 1
    # 找到最低位1所代表的数
    # 例如n=00100111,-n=11011001,-n+1=10110100,此时n & (-n+1)=00000100
    lowbit = n & (-n)
    # 对于最低位1表示的数,要么减去要么加上,我们可以返回一个最小值,然后再加上操作次数1
    return 1+min(dfs(n-lowbit),dfs(n+lowbit))
class Solution:
    def minOperations(self, n: int) -> int:
        return dfs(n)

总结

这道题的难点在于理解问题,并用二进制的角度思考问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值