377.组合总和4
给你一个由 不同 整数组成的数组 nums
,和一个目标整数 target
。请你从 nums
中找出并返回总和为 target
的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
示例 1:
1 2 3 4 5 6 7 8 9 10 11 12
| 输入:nums = [1,2,3], target = 4 输出:7 解释: 所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) 请注意,顺序不同的序列被视作不同的组合
|
回溯算法很好写代码,但是会超时
Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import java.util.Arrays;
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 res = 0; for (int x : nums) { if (x <= i) { res += dfs(i - x, nums, memo); } } return memo[i] = res; } }
|
dp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public int combinationSum4(int[] nums, int target) { int[] f = new int[target + 1]; f[0] = 1;
for (int i = 1; i <= target; i++) { for (int x : nums) { if (x <= i) { f[i] = f[i - x] + f[i]; } } }
return f[target]; } }
|