2022.1.16 力扣-周赛-得到目标值的最少行动次数-死套模板是大忌

题目描述:

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

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

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

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

方法一:

class Solution {
public:
    int minMoves(int target, int maxDoubles) {
        int ans = 0;
        while (maxDoubles > 0 && target != 1)
        {
            if (target % 2 != 0)
            {
                ans++;
                target--;
            }
            target /= 2;
            ans++;
            maxDoubles--;
        }
        if (target != 1)
        {
            ans += target - 1;
        }
        return ans;
    }
};

写这道题主要是想提醒一下自己,不要一直死套模板!

今天打周赛前一看到第二题的题目,就很自信地认为肯定是使用bfs来写,使用了单向bfs后果然超时,于是就打算使用双向bfs来试试,结果试了半天最后发现在unordered_map容器中早就已经不支持使用pair作为键值了,浪费了一大堆时间直接吐血= = 。

郁闷地去讨论区逛了逛,发现都没有人在吐槽第二题的,于是返回来又仔细看了看题目和所给的样例,发现在得到taget值之前都是交替使用递增和加倍两种操作的,如果采用逆向思维的话,从target值到1,若是偶数就除2,若是奇数就减1,这也就是交替使用递增和加倍两种操作。最后只用了几分钟就过了。

想不到折磨了那么久,都是一心想套用模板的缘故,模板好用但可不兴乱套啊!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值