Combination Sum IV -- LeetCode
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?
思路:递归求解。
为了避免相同的解重复计数,要将原数组中的重复数字剔除,这样子所有的情况都只会枚举一遍。
同时,为了提速,在递归过程中,可以用一个map记录子问题的结果,这样就可以节省时间。
补充:如果数组中有负数,则应该添加的额外条件是最多可以有几个数相加。
1 class Solution {
2 public:
3 int help(vector<int>& nums, int target, unordered_map<int, int>& solutionCount) {
4 int count = 0;
5 for (int i = 0; i < nums.size() && nums[i] <= target; i++) {
6 if (nums[i] < target) {
7 int balance = target - nums[i];
8 if (solutionCount.count(balance))
9 count += solutionCount[balance];
10 else {
11 int subCount = help(nums, balance, solutionCount);
12 solutionCount.insert(make_pair(balance, subCount));
13 count += subCount;
14 }
15 }
16 else count++;
17 }
18 return count;
19 }
20 int combinationSum4(vector<int>& nums, int target) {
21 if (nums.size() == 0) return 0;
22 sort(nums.begin(), nums.end(), less<int>());
23 vector<int> distinctNum(1, nums[0]);
24 unordered_map<int, int> solutionCount;
25 for (int i = 1; i < nums.size(); i++)
26 if (nums[i] != nums[i-1]) distinctNum.push_back(nums[i]);
27 return help(distinctNum, target, solutionCount);
28 }
29 };