题目描述:给定一个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;
}
}