找零钱的非动态规划解决方案

因为本身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);
        }
    }
};

这样会比我的原版优化特别多,虽然看起来还是一种数量级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值