【发布时间】:2019-05-29 18:17:06
【问题描述】:
您好,我刚刚解决了这个 leetcode 问题:https://leetcode.com/problems/coin-change-2/
我们的目标是找出coins 的不同可能组合的数量,我们可以使用这些组合来生成amount,假设我们有来自每个面额的无限数量的硬币。
我知道这个问题有一个在 O(amount*len(coins)) 中运行的 DP 解决方案,我可以在下面的解决方案中添加 memoization 来实现这一点。
但是,我正在努力寻找以下天真的方法的时间复杂度:
def change(amount, coins):
def helper(amount, coins, id):
if amount == 0:
return 1
res = 0
for i in range(id, len(coins)):
if coins[i] <= amount:
res += helper(amount - coins[i], coins, i)
return res
res = helper(amount, coins, 0)
return res
所以我实际上在做的是一个 DFS,我尝试在回溯并移动到下一个硬币之前尽可能多地使用第一个硬币。因此,一旦我开始使用下一个硬币,我就不能再使用第一个硬币了 --> 这使我可以不计算结果中的排列。
我知道这个解决方案的时间复杂度是O(exponential),我也知道它是O(V + E),因为它是DFS。
有人可以给出时间复杂度的确切形式吗?指数项究竟是什么?或者如何计算图中的边和顶点?
【问题讨论】:
标签: python-3.x algorithm recursion coin-change