因为本身dp其实是会的
而且注意到面试官给的空间复杂度是n,所以就放弃了dp
想用deep解决结果超时了,自己坑了自己
这是原版代码,如果arr不大的话是没啥问题的。。
作者:mus。做梦想上岸
链接:https://www.nowcoder.com/discuss/491532?channel=666&source_id=home_feed
来源:牛客网
function minMoney( arr , aim ) {
let res=100000
let len=arr.length
let f=false;
function deep(timer,sum){
if(sum>aim)return;
if(sum===aim){res=Math.min(res,timer);f=true;return;}
for(let i=0;i<len;i++){
deep(timer+1,sum+arr[i])
}
}
deep(0,0)
return f?res:-1;
}
后面去力扣找到了优化的方案,先排序,然后有点贪心私心
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);
}
}
};
这样会比我的原版优化特别多,虽然看起来还是一种数量级