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

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

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

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

    示例 1:

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

    输入:target = 19, maxDoubles = 2
    输出:7
    解释:最初,x = 1 。
    递增 3 次,x = 4 。
    加倍 1 次,x = 8 。
    递增 1 次,x = 9 。
    加倍 1 次,x = 18 。
    递增 1 次,x = 19 。
    示例 3:

    输入:target = 10, maxDoubles = 4
    输出:4
    解释:
    最初,x = 1 。
    递增 1 次,x = 2 。
    加倍 1 次,x = 4 。
    递增 1 次,x = 5 。
    加倍 1 次,x = 10 。

    提示:

    1 <= target <= 109
    0 <= maxDoubles <= 100


    1. class Solution {
    2. public int minMoves(int target, int maxDoubles) {
    3. if (target == 1) return 0;
    4. List<Integer> list = new ArrayList<>();
    5. int t = maxDoubles;
    6. int num = target;
    7. //将target将要加倍得到的数字记录下来
    8. while (t-- > 0) {、
    9. //需要大于2的结果才能加倍
    10. if (num > 2) list.add(num);
    11. else break;
    12. num /= 2;
    13. }
    14. if (list.size() == 0) return target - 1;
    15. //对list排序
    16. Collections.sort(list);
    17. int idx = 0, res = 0; //idx表示list下标 res记录答案
    18. for (int i = 1; i < target; ) {
    19. //如果还没有到将要加倍的点,直接递增到这个点
    20. if (idx < list.size() && i != list.get(idx) / 2) {
    21. res += list.get(idx) / 2 - i;
    22. i = list.get(idx) / 2;
    23. }
    24. //到了这个点,就将i设为加倍后的数字
    25. else if (idx < list.size()){
    26. res++;
    27. idx++;
    28. i = i * 2;
    29. } else {
    30. res++;
    31. i++;
    32. }
    33. }
    34. return res;
    35. }
    36. }