当前位置: 首页 > 知识库问答 >
问题:

Leetcode硬币更换超时

诸葛奇玮
2023-03-14

https://leetcode.com/problems/coin-change

以下输入得到超时,如果19-

[1,2,5]
19
// e.g. n === [1, 2, 5]
// e.g. t === target sum 
// c === counter, count each level
// h === hash, memo
var cc = function(n, t, c, h) {
    // index
    const index = t;
    // if we saw before, return it
    if(h[index]) {
        return h[index];
    }
    else if(t === 0) {
        // we use all the target, return the counter
        return c;
    }

    // mi === minimum counter
    let mi = Infinity;
    // e.g. we loop [1, 2, 5]
    for(let i=0; i<n.length; i++) {
        // only allow positive
        if(t-n[i] >= 0) {
            // recursive
            // mi === Infinity
            // t-n[i], consume it
            // c+1, increase the counter
            // h, pass down the hash
            mi = Math.min(mi, cc(n, t-n[i], c+1, h));
        }
    }

    // Update h[index] when mi < h[index]
    h[index] = mi < h[index] ? mi : h[index];
    return mi;
}


var coinChange = function(n, t) {
    const res = cc(n, t, 0, {});
    const out = res === Infinity ? -1 : res;
    return out;
};

有人知道哪里出了问题吗?

共有3个答案

储法
2023-03-14

如果我们使用额外的内存来解决这个问题,也许会更容易:

const coinChange = function(coins, amount) {
    const inf = Math.pow(2, 31)
    const dp = []
    dp[0] = 0

    while (dp.length <= amount) {
        let curr = inf - 1
        for (let index = 0; index < coins.length; index++) {

            if (dp.length - coins[index] < 0) {
                continue
            }

            curr = Math.min(curr, 1 + dp[dp.length - coins[index]])
        }

        dp.push(curr)
    }

    return dp[amount] == inf - 1 ? -1 : dp[amount]
};

蟒蛇:

class Solution:
    def coinChange(self, coins, target):
        dp = [0] + [float('inf')] * target
        for index in range(1, target + 1):
            for coin in coins:
                if index - coin >= 0:
                    dp[index] = min(dp[index], dp[index - coin] + 1)
        
        return -1 if dp[-1] == float('inf') else dp[-1]

使用辅助函数(Java):

class Solution {
    public int coinChange(int[] coins, int target) {
        if (target < 1)
            return 0;
        return helper(coins, target, new int[target]);
    }

    private int helper(int[] coins, int rem, int[] count) {
        if (rem < 0)
            return -1;
        if (rem == 0)
            return 0;
        if (count[rem - 1] != 0)
            return count[rem - 1];
        int min = Integer.MAX_VALUE;
        for (int coin : coins) {
            int res = helper(coins, rem - coin, count);
            if (res >= 0 && res < min)
                min = 1 + res;
        }

        count[rem - 1] = (min == Integer.MAX_VALUE) ? -1 : min;
        return count[rem - 1];

    }
}
  • 有关更多详细信息,请参阅讨论板,在那里您可以找到大量解释良好的、使用多种语言的公认解决方案,包括低复杂度算法和渐进运行时/内存分析1,2
汪和悌
2023-03-14

以下是能够通过测试的案例。

修正了何时更新哈希

// keep it infinity or 0 or positive
h[index] = (h[index] === undefined ? mi : mi < h[index] ? mi : h[index]);

柜台只发生在功能区内。没有混在一起

result = cc(n, t-n[i], h)
var cc = function(n, t, h) {
    // index
    const index = t;
    // reach 0, re 0
    if(t === 0) {
        return 0;
    } else if(h[index] !== undefined) {
        // hash
        return h[index];
    }

    // min
    let mi = Infinity;
    // loop coin
    for(let i=0; i<n.length; i++) {
        // posi, get in
        if(t-n[i] >= 0) {
            // return count or hash
            mi = Math.min(mi, cc(n, t-n[i], h)+1);
        }
    }

    // keep it infinity or 0 or positive
    h[index] = (h[index] === undefined ? mi : mi < h[index] ? mi : h[index]);
    return h[index];
}


var coinChange = function(n, t) {
    const res = cc(n, t, {});
    const out = res === Infinity ? -1 : res;
    return out;
};
谈萧迟
2023-03-14

代码至少有一个问题。若要查看,请更改此行:

h[index] = mi < h[index] ? mi : h[index];

为此:

console.log(`Before: t: ${ t }, mi: ${ mi }, h[index]: ${ h[index] }`);
h[index] = mi < h[index] ? mi : h[index];
console.log(`After: t: ${ t }, mi: ${ mi }, h[index]: ${ h[index] }`);

并打电话:

console.log(coinChange([1,2,5], 3));

我认为,另一个问题是希望更新h[index]中记录的结果,但同时希望在我们进行更新之前返回其中存储的结果,两者之间存在差异。

想象一下,我们可以通过各种方式达到目标0,所以请考虑一下,如果第一个递归分支通过多个步骤的路径到达目标0,那么当前会发生什么。

 类似资料:
  • 问题:https://leetcode.com/problems/coin-change/ 解决方案:https://repl.it/@Stylebender/HatefulAliceBlueTransverse#index.js 我理解从“按钮式”构建dp阵列解决方案的一般概念流程,但我只是想知道关于第10行: dp[i]=数学。最小值(dp[i],1 dp[i-硬币[j]]; 当你选择当前的第

  • 我试图自己解决LeetCode问题322。硬币兑换: 您将获得一个整数数组,表示不同面额的硬币,以及一个整数金额,表示总金额。 返回您需要的最少数量的硬币,以弥补该金额。如果这些硬币的任何组合都无法弥补这一数额,则返回-1。 你可以假设每种硬币的数量是无限的。 我似乎有一个错误,无法找出它。 我用DFS解决,基本上是说当目标达到0时,只需将所有的聚集在一个数组中,并动态地保持尽可能短的结果。这是问

  • 动态规划变更问题(有限硬币)。我正在尝试创建一个以以下内容作为输入的程序: 输出: 输出应该是大小为1的数组,其中每个单元格代表我们需要改变单元格索引量的最佳硬币数。 假设数组的单元格位于index: 5,内容为2。这意味着为了给出5(INDEX)的变化,您需要2(单元格的内容)硬币(最佳解决方案)。 基本上,我需要这个视频的第一个数组的输出(C[p])。这与有限硬币的大区别是完全相同的问题。链接

  • 硬币兑换是一个非常普遍的问题,它问你有多少种方法可以使用硬币(C[0],C[1]…C[K-1])得到N美分的总和。DP解决方案是使用方法s(N,K)=s(N,K-1)s(N-C[K-1],K),其中s(N,K)是与前K个硬币(按升序排序)求和N的方法数量。这意味着使用前K个硬币获得N美分的方式数量是不使用第K个硬币获得相同金额的方式数量加上获得N-第K个硬币的方式数量的总和。我真的不明白你怎么会想

  • 所以我对编码不熟悉,我得到了一个任务,我需要做一个程序,用四分之一、一角、五分和一美分给不到一美元的零钱。然而,作业希望程序打印所需的最低硬币数量(例如,如果我输入58美分,那么输出应该是“2个25美分,1个镍和3个便士”,而不是“2个25美分,0个10美分,1个镍和3个便士”。本质上,如果没有某种硬币,那么程序就不应该打印它)。我一直在想如何制作它,这样程序就不会打印任何不必要的硬币。 这就是我

  • 尝试为一般硬币更换问题编程一个DP解决方案,该解决方案还可以跟踪使用的硬币。到目前为止,我一直在努力给我所需的最低硬币数量,但不知道如何获得使用了哪些硬币以及使用了多少次。我尝试设置另一个表(布尔值),如果硬币被使用,但这似乎不能正常工作。有什么想法吗?