题目
你正在玩一个整数游戏。从整数 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
}