持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
今天,我们继续搞算法。
题目描述
解题过程
这是一道零钱对换的力扣题,拿到题目的时候我整个人度是懵逼的,我也不知道咋算,但是凭借我过人的直觉,返回值是一个int,那我就给它个int就好了呀,于是,我写下了这段代码:
噗哈哈,暴力写法,题目度还没用上,别着急,接下来我们就要开始分析了: 给了个coins是一个数组,就是相当于我们的储钱罐,然后这个amount就是我们要达到的硬币数,比如我们要买个小模型,就开始倒钱了,问怎么倒是最少的?
最简单的就是暴力搜索了,全部搜索一遍,先不考虑,再看看有没有更好的算法,那贪心?我们每次取最大,比如我们的小模型就是18块,储钱罐有10、9和1块,第一次取最大10块没毛病,还剩8块,但9比8大,就剩1,也就是说拼8的策略只有1,显然不是最好的。
我们看看为什么不选暴力搜索,因为它会把所有情况度考虑一遍,但是我们能不能在搜索中进行比较,判断如果是差的分支就直接砍掉呢?比如我目标是18,我可以找9(18-9),找10(18-10),找1(18-1),我们这几个比较找最小,不就好了嘛?所以我们需要什么呢?我们需要把这个amount所有可能的情况拿出来,找一个最小的放进去,所以这个opt应该是一个数组,答案就是opt[amount] ,但是这个opt[amount]是由opt[i]拼成的。那我们可以按照我们的分析搞一下代码。
你以为到这就结束了?其实并没有,我们需要考虑一下边界:
测试没问题,ok,但提交的时候没过,卧槽,我这写bug呢?
opt[27]=opt[27-10]+opt[17-10]+opt[5]+opt[2]=4,没问题啊,但是是刚好加够一倍,说明写错了,哪里写错了呀?我这一看是加1.写错了,外面加1就加多了。
通过了,开心。
我是小coder,希望大家喜欢我,嘿嘿嘿!!!