【发布时间】:2021-10-01 06:23:21
【问题描述】:
这是对 Stack Overflow 上this question 的跟进。
编写一个函数“howSum(targetSum, numbers)”,它接受一个 targetSum 和一个数字数组作为参数。
该函数应该返回一个数组,其中包含任何元素的组合,这些元素的总和正好是 targetSum。
如果没有组合到 targetSum,则返回 None。如果可能有多种组合,您可以返回任何一种。
我的解决方案的记忆python代码如下:
def howSum(targetSum, nums, memo = None):
if memo is None:
memo = {}
if targetSum in memo: return memo[targetSum]
if targetSum < 0: return None
if targetSum == 0: return []
for num in nums:
remainder = targetSum - num
remainderResult = howSum(remainder, nums)
if remainderResult is not None:
remainderResult.append(num)
memo[targetSum] = remainderResult
return memo[targetSum]
memo[targetSum] = None
return None
print(howSum(7, [2, 3])) # [3,2,2]
print(howSum(7, [5, 3, 4, 7])) # [4,3]
print(howSum(7, [2, 4])) # None
print(howSum(8, [2, 3, 5])) # [2,2,2,2]
print(howSum(300, [7,14]) # None
该算法有效,但对于最终测试用例而言效率不高。实际上,运行时效率与蛮力解决方案没有什么不同。有什么问题?
【问题讨论】:
-
请包括您的运行时间,您是否也没有严格根据总和进行记忆(即使传递了不同的序列)?如果您在如此小的数组上对其进行测试,那么无论算法如何,都可能不会察觉到运行时差异。
标签: javascript python python-3.x dynamic-programming memoization