You are given an array of distinct integers nums and a target integer target, return the number of possible combinations that add up to target.
The test cases are generated so that the answer can fit in a 32-bit integer.
Example 1:
Input: nums = [3,1,2], target = 4
Output: 7Explanation: The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
Example 2:
Input: nums = [1], target = 3
Output: 1Constraints:
1 <= nums.length <= 2001 <= nums[i], target <= 1000nums are unique.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?
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
nums.sort()
def dfs(total):
if total == 0:
return 1
res = 0
for i in range(len(nums)):
if total < nums[i]:
break
res += dfs(total - nums[i])
return res
return dfs(target)Where is the size of the array and is the given target.
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
nums.sort()
memo = { 0 : 1 }
def dfs(total):
if total in memo:
return memo[total]
res = 0
for num in nums:
if total < num:
break
res += dfs(total - num)
memo[total] = res
return res
return dfs(target)Where is the size of the array and is the given target.
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = { 0 : 1 }
for total in range(1, target + 1):
dp[total] = 0
for num in nums:
dp[total] += dp.get(total - num, 0)
return dp[target]Where is the size of the array and is the given target.
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
nums.sort()
dp = defaultdict(int)
dp[target] = 1
for total in range(target, 0, -1):
for num in nums:
if total < num:
break
dp[total - num] += dp[total]
return dp[0]Where is the size of the array and is the given target.