[leetcode] 991. Broken Calculator

Description

On a broken calculator that has a number showing on its display, we can perform two operations:

  • Double: Multiply the number on the display by 2, or;
  • Decrement: Subtract 1 from the number on the display.

Initially, the calculator is displaying the number X.

Return the minimum number of operations needed to display the number Y.

Example 1:

Input: X = 2, Y = 3
Output: 2
Explanation: Use double operation and then decrement operation {2 -> 4 -> 3}.

Example 2:

Input: X = 5, Y = 8
Output: 2
Explanation: Use decrement and then double {5 -> 4 -> 8}.

Example 3:

Input: X = 3, Y = 10
Output: 3
Explanation:  Use double, decrement and double {3 -> 6 -> 5 -> 10}.

Example 4:

Input: X = 1024, Y = 1
Output: 1023
Explanation: Use decrement operations 1023 times.

Note:

  1. 1 <= X <= 10^9
  2. 1 <= Y <= 10^9

分析

题目的意思是:给定X和Y两个数,求X可以乘2或者减1,求最少操作步骤使X变成Y。这道题我参考了一下答案,可以反向通过Y变成X,如果Y是偶数,则除以2,如果是奇数则加上1,直到Y小于等于X为止。最后的结果就是res+X-Y,我验证了一下,确实是这样的,可能是用到了贪心的算法:通过除 2,使 Y 不断的逼近 X。对于偶数,除 2 操作,不管怎么样,肯定比递增 Y 好

代码

class Solution:
    def brokenCalc(self, X: int, Y: int) -> int:
        res=0
        while(Y>X):
            res+=1
            if(Y%2==1):
                Y+=1
            else:
                Y=Y//2
        return res+X-Y

参考文献

solution

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值