21.坏了的计算器(medium)

1.题目链接:

991. 坏了的计算器 - 力扣(LeetCode)991. 坏了的计算器 - 在显示着数字 startValue 的坏计算器上,我们可以执行以下两种操作: * 双倍(Double):将显示屏上的数字乘 2; * 递减(Decrement):将显示屏上的数字减 1 。给定两个整数 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 <= 109https://leetcode.cn/problems/broken-calculator/description/2.题目描述:

在显示着数字 startValue  的坏计算器上,我们可以执行以下两种操作:​

双倍(Double):将显示屏上的数字乘 2;​
递减(Decrement):将显示屏上的数字减 1  。​

给定两个整数 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;
    }
}

运行结果:

贪心策略:

笔者这里尝试了正面的方法,很难在正确的前提下去,进行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值