LC 2571. 将整数减少到零需要的最少操作数
https://leetcode.cn/problems/minimum-operations-to-reduce-an-integer-to-0/
这题想到贪心稍有点难,可以先考虑递归搜索的情况.
每次扩展的时候其实不用考虑所有的bit,只需要考虑lowbit的就行,然后加上记忆化搜索。
class Solution: def minOperations(self, n: int) -> int: import functools @functools.cache def search(x): if x & (x - 1) == 0: return 1 # to get the lowest bit. lb = x & -x return 1 + min(search(x + lb), search(x - lb)) return search(n)
贪心的策略则是:
- 如果有连续的1,那么可以+1
- 连续的1如果不断地进位,然后最后-1,这样就是2次操作
- 而如果每直接每个位都-1, 那么至少2次操作
- 对于不连续的1,那么可以-1
class Solution: def minOperations(self, n: int) -> int: ans = 1 while n & (n-1) != 0: lb = n & (-n) # (1 << lowbit) if (n & (lb << 1)): n += lb # 如果连续的1,那么直接加上,可能造成连续进位 else: n-=lb # 删除这个位上的1 ans += 1 return ans