991题:坏了的计算器

在显示着数字的坏计算器上,我们可以执行以下两种操作:
双倍(Double):将显示屏上的数字乘 2;
递减(Decrement):将显示屏上的数字减 1 。
最初,计算器显示数字 X。
返回显示数字 Y 所需的最小操作数。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/broken-calculator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

func brokenCalc(X int, Y int) int {
    var getStep func(a, b int) int
    getStep = func(a, b int) int{
        if a >= b {
            return a - b
        }
        if b % 2 == 0 {
            return 1 + getStep(a, b/2)
        }
        return 1 + getStep(a, b+1)
    }
    return getStep(X, Y)
}

解题关键:

首先X>=Y时只有一种解决方法就是递减。需要X-Y步完成。
X逆向思考可知,X乘2等效于Y除以2。X接近Y的过程操作数等于Y接近X的操作数。

贪心思想认为在接近X的过程中Y/2是一种跨度比较大的方法,递增是跨度较小的方法。能用的场合应尽量使用Y/2。

构建递归的过程:

  • 思考返回结果的意义。
    返回值是操作数。
  • 弄清楚递推结束的边界,定义“归”的起始动作
    X>=Y时,只能通过递减靠近Y。
  • 然后写递推的过程,确保每个分歧都能到达结束的边界
    分歧是“Y是奇数还是偶数?”,进入递推最终都可以使X>=Y。
  • 拿到自身“归”的结果并与现阶段结果复合返回(如果需要的话)
    分歧返回时,操作数+1.

你可能感兴趣的:(刷题日常)