题目:
给你一个由 不同 整数组成的数组 nums
,和一个目标整数 target
。请你从 nums
中找出并返回总和为 target
的元素组合的个数。(nums中的元素可以重复使用)
题目数据保证答案符合 32 位整数范围。
思路:
本质上是 70. 爬楼梯,每次从 nums 中选一个数,作为往上爬的台阶数,计算爬 target 个台阶有多少种方案。70 那题相当于 nums=[1,2],因为每次只能爬 1 个或 2 个台阶。
代码:
java
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] memo = new int[target + 1];
Arrays.fill(memo, -1);
return dfs(target, nums, memo);
}
private int dfs(int i, int[] nums, int[] memo) {
if (i == 0) {
return 1;
}
if (memo[i] != -1) {
return memo[i];
}
int total = 0;
for (int num : nums) {
if (num <= i) {
total += dfs(i - num, nums, memo);
}
}
memo[i] = total;
return memo[i];
}
}
性能:
