0991. 坏了的计算器
大约 2 分钟
---
0991. 坏了的计算器
- 标签:贪心、数学
- 难度:中等
题目链接
题目大意
描述:
在显示着数字 的坏计算器上,我们可以执行以下两种操作:
- 双倍(Double):将显示屏上的数字乘 2;
- 递减(Decrement):将显示屏上的数字减 1。
给定两个整数 和 。
要求:
返回显示数字 所需的最小操作数。
说明:
- 。
示例:
- 示例 1:
输入:startValue = 2, target = 3
输出:2
解释:先进行双倍运算,然后再进行递减运算 {2 -> 4 -> 3}.- 示例 2:
输入:startValue = 5, target = 8
输出:2
解释:先递减,再双倍 {5 -> 4 -> 8}.解题思路
思路 1:逆向贪心
思路
这道题可以进行两种操作:乘 (Double)和减 (Decrement),要求从 到 的最少操作数。
如果正向思考,每一步有两种选择,会导致搜索空间很大。我们可以 逆向思考:
- 从 出发,逆向操作回到 。
- 逆向操作为:除以 (对应正向的乘 )和加 (对应正向的减 )。
贪心策略:
- 如果 ,只能一直减 ,操作数为 。
- 如果 是偶数,除以 更优(一次操作减少一半)。
- 如果 是奇数,必须先加 变成偶数,然后再除以 。
代码
class Solution:
def brokenCalc(self, startValue: int, target: int) -> int:
count = 0
# 从 target 逆向到 startValue
while target > startValue:
if target % 2 == 0:
# target 是偶数,除以 2
target //= 2
else:
# target 是奇数,加 1
target += 1
count += 1
# 如果 target < startValue,需要减 1 操作
count += startValue - target
return count复杂度分析
- 时间复杂度:,每次除以 会使 减半,最多需要 次操作。
- 空间复杂度:,只使用了常数个额外变量。