1.题目链接:
在显示着数字 startValue 的坏计算器上,我们可以执行以下两种操作:
◦ | 双倍(Double):将显示屏上的数字乘 2; |
◦ | |
给定两个整数 startValue 和 target 。返回显示数字 target 所需的最小操作数。
示例 1:
输入:startValue = 2, target = 3
输出:2
解释:先进行双倍运算,然后再进行递减运算 {2 -> 4 -> 3}.
示例 2:
输入:startValue = 5, target = 8
输出:2
解释:先递减,再双倍 {5 -> 4 -> 8}.
示例 3:
输入:startValue = 3, target = 10
输出:3
解释:先双倍,然后递减,再双倍 {3 -> 6 -> 5 -> 10}.
提示:
◦ | 1 <= startValue, target <= 10^9 |
3. 解法(贪心):
贪心策略:
正难则反:
当「反着」来思考的时候,我们发现:
i. | 当 end <= begin 的时候,只能执行「加法」操作; |
ii. 当 end > begin 的时候,对于「奇数」来说,只能执行「加法」操作;对于「偶数」来 说,最好的方式就是执行「除法」操作
这样的话,每次的操作都是「固定唯一」的。
Java算法代码:
class Solution {
public int brokenCalc(int startValue, int target) {
//正男则反 + 贪心
int ret = 0;
while(target > startValue){
if(target % 2 == 0) target /=2;
else target +=1;
ret ++;
}
return ret + startValue - target;
}
}
运行结果:
贪心策略:
笔者这里尝试了正面的方法,很难在正确的前提下去,进行