Leetcode 377. Combination Sum IV

Problem Explanation:

We have an array of positive integers and a target positive integer. We have to find out the possible combinations of the array elements that sum up to the target. Here, sequences are treated as different combinations. That means (1,2) and (2,1) are considered to be two different combinations. If there are no possible combinations, we should return 0.

For example, consider an array nums=[1,2,3] and target=4

We have the following combinations:

  • (1, 1, 1, 1)
  • (1, 1, 2)
  • (1, 2, 1)
  • (1, 3)
  • (2, 1, 1)
  • (2, 2)
  • (3, 1)

So, we should return 7 as the answer as there are 7 possible combinations.

Approach to Solution:

As it's a problem of combinations, it can be solved using dynamic programming. We will take each number from the array and try to find a combination up to the target.

Starting from 0 to target, for each number i in this range, we look at the numbers in the array nums which are less than or equal to i and add dp[i-num] to dp[i], where dp[i] represents the number of combinations for the number i. For each i, dp[i] is initially set to 0. But for dp[0], as the number zero can be represented by no numbers, dp[0] is set to 1. In the end, dp[target] will represent the number of combinations for our target value.

Python Solution:

3class Solution:
4    def combinationSum(self, nums, target):
5        dp = [0] * (target+1)
6        dp[0] = 1
7        for i in range(1, target+1):
8            for num in nums:
9                if num <= i:
10                    dp[i] += dp[i-num]
11        return dp[target]

Java Solution:

3class Solution {
4    public int combinationSum(int[] nums, int target) {
5        int[] dp = new int[target+1];
6        dp[0] = 1;
7        for (int i = 1; i <= target; i++) {
8            for (int num : nums) {
9                if (num <= i) {
10                    dp[i] += dp[i-num];
11                }
12            }
13        }
14        return dp[target];
15    }

JavaScript Solution:

3var combinationSum = function(nums, target) {
4    let dp = new Array(target+1).fill(0);
5    dp[0] = 1;
6    for(let i=1; i<=target; i++) {
7        for(let num of nums) {
8            if(i >= num) {
9                dp[i] += dp[i-num];
10            }
11        }
12    }
13    return dp[target];

C++ Solution:

3class Solution {
5    int combinationSum(vector<int>& nums, int target) {
6        vector<unsigned long long int> dp(target+1, 0);
7        dp[0] = 1;
8        for (int i = 1; i <= target; i++) {
9            for (int num : nums) {
10                if (i >= num) {
11                    dp[i] += dp[i-num];
12                }
13            }
14        }
15        return dp[target];
16    }

C# Solution:

3public class Solution {
4    public int CombinationSum(int[] nums, int target) {
5        int[] dp = new int[target+1];
6        dp[0] = 1;
7        for(int i = 1; i <= target; i++) {
8            foreach(int num in nums) {
9                if(i >= num) {
10                    dp[i] += dp[i - num];
11                }
12            }
13        }
14        return dp[target];
15    }

The time complexity of this solution is O(n*m) where n is the target and m is the size of the array. The space complexity is O(n) where n is the target as we need to store the combinations in an array of size target+1.As we can see, by using a dynamic programming approach, we can efficiently solve this combination problem. While the problem might seem complex at first glance, by breaking it down and handling it step-by-step, we can solve it effectively.

The python solution defines a function called combinationSum that takes the array of integers and the target value. We first create an array dp of size target+1 and fill it with zeros. We then set dp[0] to 1. We then iterate from 1 to target and for each i, we iterate through the array of numbers. If a number is less than or equal to i, we add dp[i-num] to dp[i].

The java solution follows the same approach. However, the syntax varies as per the Java language.

The Javascript solution is similar to the previous solutions. We use the 'let' keyword to declare variables in the function. In a for-of loop (let num of nums), we are able to iterate through each value in the array nums.

The C++ solution uses vector to create the dp array. A for-loop is used to iterate through all integers from 1 to target. A ranged-for loop (for int num : nums) is used to iterate through the values in nums.

The C# solution combines elements from the previous solutions. This solution uses a for-each loop (foreach (int num in nums)) that dynamically adjusts based on the size of the nums array.

In conclusion, while the solutions vary slightly in syntax, they all deliver the same results using dynamic programming principles. The time complexity of each solution is O(n*m) and the space complexity is O(n), making this an efficient algorithm for finding combinations of numbers that add up to a given target value. These solutions can be easily implemented in any project that requires finding combinations for a specific target.

Got a question? Ask the Teaching Assistant anything you don't understand.

Still not clear? Ask in the Forum,  Discord or Submit the part you don't understand to our editors.

TA 👨‍🏫