【发布时间】:2020-08-10 07:09:59
【问题描述】:
问题说明:
如果我们可以为每个整数分配一个正号或负号 一组整数,有多少种方法可以将有符号整数相加 等于目标值?我们必须使用集合中的每个整数。
例如 [1, 2, 3, 2], 目标 = 0
两种方式 [-1, 2, -3, 2] 和 [1, -2, 3, -2]
我的解决方案如下(java)
public static void main(String[] args) {
int[] nums = {1, 2, 3, 2};
int x = helper(0, 0, nums, 0);
System.out.println(x);
}
private static int helper(int step, int sumSoFar, int[] nums, int target) {
if (step == nums.length) {
return sumSoFar == target ? 1 : 0;
}
return
helper(step + 1, sumSoFar + nums[step], nums, target)
+
helper(step + 1, sumSoFar - nums[step], nums, target);
}
我知道在蛮力解决方案中有许多可能的重复计算,但我不明白传入 sumSoFar 变量是否有效地形成了一种记忆技术?
如果没有,我该如何使用 memoization 来提高该算法的运行时性能?
【问题讨论】:
-
空集也是答案吗?我看到您的递归中有多个值发生变化,我不确定记忆是否有帮助。
-
我添加了我们必须使用集合中的每个整数的条件,因此空集不是有效的解决方案。
-
对不起。我可以说通过
sumSoFar似乎不是任何形式的记忆。通常,我希望有一个额外的数组或映射来存储整个记忆值表(以记住以前的结果)。但正如我已经提到的,我没有看到利用记忆化来解决这个特定问题的方法。这并不意味着它不存在。只是我不知道。此外,空集(如果有效)仅适用于0(我认为)。
标签: java algorithm recursion memoization