[LeetCode] 377. Combination Sum IV

Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.
Example:
nums = [1, 2, 3]
target = 4

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.

Therefore the output is 7.
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?

Thought process:
Dynamic programming.
  1. Sub-problem: find the number of possible combinations that add up to a number smaller than target.
  2. Function: f[i] = sum(f[i - nums[j]]).
  3. Initialization: f[0] = 1.
  4. Answer: f[target].

Solution:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] f = new int[target + 1];
        f[0] = 1;
        
        for (int i = 1; i < f.length; i++) {
            int sum = 0;
            for (int j = 0; j < nums.length; j++) {
                if (nums[j] <= i) {
                    sum += f[i - nums[j]];
                }
            }
            f[i] = sum;
        }
        
        return f[target];
    }
}

Time complexity:
Say nums's length is a and target = b, the overall time complexity is O(ab).

Follow-up:
If negative numbers are allowed in the given array, then there could be infinite solutions to the problem, because whenever the sum approaches target, I can add a negative number to make the sum less. 
To allow negative numbers, the length of the combinations needs to be limited.

Comments

Post a Comment

Popular posts from this blog

[LeetCode] 714. Best Time to Buy and Sell Stock with Transaction Fee

[LeetCode] 269. Alien Dictionary

[LeetCode] 631. Design Excel Sum Formula