Leetcode 322:用 2 种编程语言找硬币会产生 2 种不同的结果

Posted

技术标签:

【中文标题】Leetcode 322:用 2 种编程语言找硬币会产生 2 种不同的结果【英文标题】:Leetcode 322: Coin change with 2 programming languages produces 2 different results 【发布时间】:2022-01-14 10:20:43 【问题描述】:

我正在尝试解决Leetcode Problem 322。这是网站上引用的描述。

给你一个整数数组coins,表示不同面额的硬币,一个整数表示总金额。

返还您需要的最少数量的硬币来弥补该金额。如果该金额不能由任何硬币组合弥补,则返回-1。

您可以假设您拥有无限数量的每种硬币。

我已经编写了 2 个递归解决方案,1 个用 Python 编写,1 个用 javascript 编写。出于某种原因,Javascript 中的那个不会为相同的输入生成正确的值,而 Python 中的那个总是这样。

想问一下是否有人知道导致输出差异的原因。我尝试了以下测试用例:

coins = [1,2,5], amount = 11 => Expected: 3 
coins = [1,2], amount = 2 => Expected: 1

这是我用各种语言编写的代码。

Javascript

var coinChange = function(coins, amount) 
    coins = coins.sort((a,b) => b -a )
    ans = helper(coins, amount, 0)
    if (ans >= Number.MAX_VALUE) 
        return -1
    
    return ans;
;


function helper(coins, amount, pos) 
    if (pos >= coins.length || amount < 0) 
        return Number.MAX_VALUE; 
     else if (amount === 0) 
        return 0; 
    

    left = helper(coins, amount - coins[pos], pos) + 1
    right = helper(coins, amount, pos + 1)

    return Math.min(left, right)
   

使用上面两个测试用例,两个测试用例都错了。

coins = [1,2,5], amount = 11 => Expected: 3, gets 2
coins = [1,2], amount = 2 => Expected: 1, gets 2

Python

def coinChange(coins, amount):
    coins = sorted(coins, reverse = True)    
    ans = helper(coins, amount, 0)
    if (ans >= float("inf")):
        return -1
    return ans

def helper(coins, amount, pos):
    if (pos >= len(coins) or amount < 0):
        return float("inf")
    elif (amount == 0):
        return 0
    left = helper(coins, amount - coins[pos], pos) + 1
    right = helper(coins, amount, pos + 1)

    return min(left, right)

使用上述 2 个测试用例,两个测试都正确。

coins = [1,2,5], amount = 11 => Expected: 3, gets 3
coins = [1,2], amount = 2 => Expected: 1, gets 1

【问题讨论】:

你试过调试你的代码吗? What is a debugger and how can it help me diagnose problems? 和 How to debug small programs 是的,在发布这个问题之前,我已经使用print 调试进行了一些调试。会认为 javascript 代码中的递归树存在问题,但无法验证可能是什么原因。令人惊讶的是,Python 等效项有效,因此想在这里检查 Javascript 代码中的错误是否是由于 Javascript 特定的原因造成的 问题是你没有声明你的变量。它们都是隐式全局变量。因此,所有递归执行都使用相同的数据并将其混合在一起。 @VLAZ 感谢您的大提示,在我最初尝试调试时没有注意到这一点 【参考方案1】:

Javascript 代码通过将 let 添加到每个递归调用的返回值来获得预期的答案。

例如left = helper(coins, amount - coins[pos], pos) + 1改为

let left = helper(coins, amount - coins[pos], pos) + 1

【讨论】:

以上是关于Leetcode 322:用 2 种编程语言找硬币会产生 2 种不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

动态规划LeetCode322零钱兑换

[LeetCode] 322. 零钱兑换 ☆☆☆(动态规划)

LeetCode:零钱兑换322DP

leetcode 322 零钱兑换

动态规划LeetCode322零钱兑换

LeetCode 322 零钱兑换