leetcode--Broken Calculator

题目描述:给定一个X和一个Y,X只能由减一或者乘以2的操作,请问怎么才能使用最少的步骤从X转化成Y?

分析:Reveal Cards In Increasing Order这道题我总结出这样的规律,假如出现这种规则驱动的问题,如果正常不好解,我们可以逆向来做,这道题也是这样,X经过一些规则转化成为Y,那么也就是Y经过相反的操作变成X?

(1)假如Y<X,Y只能不断加一靠近X,很容易解决
(2)假如Y>X,如果Y是一个奇数,很显然,它需要+1,因为后面必然需要除以2才能减小,因此奇数必须转化成偶数,接下来就是偶数Y继续加一,还是先除以2呢,分析时很是纠结。

  • 如果 2X>Y成立的话,我们可以设
    2X=Y+2n
    X=Y/2+n
    从这两个式子就可以分析出,加一操作最后成功步数是2*n+1(2n次加法和一个除法)
    而直接除以2以后再加一,成功步数是1+n。当然可以加和除法交替进行,结果步数在这二者之间,所以选择先做除法

  • 假如Y>2X,那么,直觉上更要先做除法操作。因为最终要做除法使得情况回到上面那种情况。我们做两次加法和一次除法的操作,用一次出发和一次加法也可以搞定:
    2——》6

6/2=3 一次操作
(6+1+1)/2 = 4 (三次操作)
对于4这个结果,也可以使用6/2+1(两次操作得到),那么为什么要先做加法浪费次数呢?

综上可知,当Y为大于X的偶数是,都要先做除法。这也算是贪心算法吧!

class Solution {
   public int brokenCalc(int X, int Y) {
       int res = 0; 
        while(Y!=X){
            if(X>Y)return res+X-Y;
            else if(Y%2!=0){
                Y++;
                res++;
            } 
            while(Y%2==0&&Y>X){
                 res++;
                 Y = Y/2;
                 if(Y==X)return res;
        }
        }
       return res;
   }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值