0377. Combination Sum IV
https://leetcode.com/problems/combination-sum-iv
Description
Given an array of distinct integers nums
and a target integer target
, return the number of possible combinations that add up to target
.
The answer is guaranteed to fit in a 32-bit integer.
Example 1:
**Input:** nums = [1,2,3], target = 4
**Output:** 7
**Explanation:**
The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
Note that different sequences are counted as different combinations.
Example 2:
**Input:** nums = [9], target = 3
**Output:** 0
Constraints:
1 <= nums.length <= 200
1 <= nums[i] <= 1000
All the elements of
nums
are unique.1 <= target <= 1000
Follow up: What if negative numbers are allowed in the given array? How does it change the problem? What limitation we need to add to the question to allow negative numbers?
ac1: top-down DP, DFS + memorization
similar: https://leetcode.com/problems/coin-change/description/
class Solution {
Map<Integer, Integer> map = new HashMap<>();
public int combinationSum4(int[] nums, int target) {
// exit
if (target == 0) return 1; // empty is counted as 1
if (map.containsKey(target)) return map.get(target);
// iterate
int res = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] <= target) {
res += combinationSum4(nums, target-nums[i]);
}
}
map.put(target, res);
return res;
}
}
ac2: bottom-up DP
class Solution {
public int combinationSum4(int[] nums, int target) {
// edge cases
if (nums == null || nums.length == 0 || target <= 0) return 0;
int[] dp = new int[target+1]; // dp[i]: how many combinations that sum up to i.
dp[0] = 1;
for (int i = 1; i <= target; i++) {
for (int j = 0; j < nums.length; j++) {
if (i - nums[j] >= 0) {
dp[i] += dp[i-nums[j]];
}
}
}
return dp[target];
}
}
// 1) dp[i]: how many combinations add up to i; 2) for each i, iterate nums.
// O(target*N) time, O(target) space
Last updated
Was this helpful?