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)
总结
这道题的难点在于理解问题,并用二进制的角度思考问题。