去力扣找了一个解答是动规优化的,emmm我感觉我那个的主要问题还是优化不到位,应该先排序然后从大的开始往小的找,最坏情况才会是我那个算法的情况,而且用了k还会少很多分支 var minMoney = function(coins, amount) { if(!amount) return 0; coins.sort((a,b) => b - a); let ans = Infinity;//最小面值数 let len = coins.length; coinChange(amount, 0, 0);//当前总金额,当前coins的下标,当前面值数 return ans === Infinity ? -1 : ans; function coinChange(amount, index, count) { if(!amount) { ans = Math.min(ans, count); return; } if(index === len) return; for(let k = (amount / coins[index])|0; k >= 0 && k + count < ans; k --) { //k + count < ans 优化剪枝 //k用来贪心思想 //k从(amount / coins[index])|0开始,所以不会小于0 coinChange(amount - k * coins[index], index + 1,count + k); } } };
点赞 3

相关推荐

04-02 16:28
苏州大学 Java
之前说结束写面经的,挂完休息两天来写了(我感觉我这段经历很奇怪,前两面简单得离谱,估计跟部门有关)——————————————————————————————————————————3.24&nbsp;一面(3.26&nbsp;约二面)Java里的值传递&nbsp;vs&nbsp;引用传递什么是反射、优缺点类加载机制jvm指令,方法调用其它方法时的jvm指令jdk17的特性nio、bio、aio&nbsp;的区别粘包拆包的原因、解决方法redis的优缺点线程&nbsp;vs&nbsp;进程死锁OSI七层模型http&nbsp;vs&nbsp;httpshttps怎么加密单例bean线程安全?jdk动态代理&nbsp;vs&nbsp;CGLIB@Autowire&nbsp;vs&nbsp;@Resource了解golang...
沙福林:三面这个你问他,你知道吗?你说出来我想学习一下。用lua脚本是为了保证一捆redis命令可以一起成功或者失败,并且只需要发送一次请求。java中虽然可以用redis的事务,但是事务是把所有命令放在队列然后统一提交,这个提交并不会一起成功一起失败,而是成功的成功,失败的失败,这样的话很难保证一致性,此外redis的事务也不是一起发请求,而是一起执行,逐个发请求,从性能开销和实现效果角度出发,必须用lua脚本。
点赞 评论 收藏
分享
牛客网
牛客企业服务