Leetcode991 Broken Calculator
原题
链接:https://leetcode.com/problems/broken-calculator/
大意:
- 给定X和Y,X可以经过乘以2或者减1操作使之与Y相等
- 求最少的操作次数
原始想法
看到题目的第一反应就联想到了去上学的那道题目,于是用队列写了一下,提交之后发现超时了,感觉上是X到Y操作的时候不确定性过高导致对于队列的操作的次数过多。
逆向思考
很神奇的是Y到X的操作是确定的:
-
若当前Y是奇数,只可以进行加1操作
-
若当前Y是偶数,分两种情况考虑
如果当前Y大于X,则进行除法操作;
由(a+b)/2=a/2+b/2可知
先进行除法操作之后再进行加法操作的次数小于先进行加法再进行除法的加法的次数如果当前Y小于X,则进行加法操作;
这里显然加法比除法操作更优
优化
当前Y是偶数且Y小于X的情况可以一步到位,认识到在到达X之前将一直小于X,所以根据上述讨论,将一直进行加法操作,次数即可确定,直接得到最终结果。
AC代码
#include <iostream>
using namespace std;
class Solution {
public:
int brokenCalc(int X, int Y) {
int tmp=Y;
int rel=0;
while(tmp!=X)
{
if(tmp%2==1){tmp++;rel++;}
else{
if(tmp<X){
rel+=(X-tmp);
tmp=X;
}
else{tmp/=2;rel++;}
}
}
return rel;
}
};