[路飞]_得到目标值的最少行动次数

158 阅读1分钟

5194. 得到目标值的最少行动次数

题目

你正在玩一个整数游戏。从整数 1 开始,期望得到整数 target 。

在一次行动中,你可以做下述两种操作之一:

递增,将当前整数的值加 1(即, x = x + 1)。 加倍,使当前整数的值翻倍(即,x = 2 * x)。 在整个游戏过程中,你可以使用 递增 操作 任意 次数。但是只能使用 加倍 操作 至多 maxDoubles 次。

给你两个整数 target 和 maxDoubles ,返回从 1 开始得到 target 需要的最少行动次数。

示例1

输入: target = 5, maxDoubles = 0
输出: 4
解释: 一直递增 1 直到得到 target 。

题解

核心:从1增加到n的过程也就是从n减小到1的过程

  • 因为每次操作递增只能增加1,加倍可以使当前值翻倍,所以翻倍要尽量多,尽量大才能使操作次数少
  • 所以在n减小到1的过程,遇到偶数且可使用的加倍次数大于0;减倍,如果是奇数,-1;
  • 循环执行上述操作,知道n等于1

代码

var minMoves = function (target, maxDoubles) {
  if (maxDoubles === 0) return target - 1
  let result = 0
  while (target > 1) {

    if (target % 2 === 1) {
      result++
      target--
    } else {
      if (maxDoubles > 0) {
        target = target / 2
        result++
        maxDoubles--
      } else {
        return result + target - 1
      }
    }
  }
  return result
}