leetcode-377. Combination Sum IV

来源:互联网 发布:网站源码建站 编辑:程序博客网 时间:2024/04/27 22:13

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.

源码:

class Solution {public:int combinationSum4(vector<int>& nums, int target) {int size = nums.size();if (size == 0)return 0;vector<int>re(target + 1, 0);//全部置0sort(nums.begin(),nums.end());int min_value = *nums.begin();re[min_value] = 1;for (int i = min_value + 1; i <= target; i++){for (int j = 0; j < size; j++){if(i-nums[j]>=0)re[i] = re[i] + re[i - nums[j]];}if (find(nums.begin(), nums.end(), i) != nums.end())re[i]++;}return re[target];}};

Submission Result: Accepted  More Details 

Next challenges: (M) Combination Sum

分析:
我们以上述例子来分析,当i=1时,此时只有一个组合的和等于1,那就是数组的第一个元素1;然后依次得到2的所有组合,它们关系如下:
sum=1

1

sum=2

1,1;

2;

sum=3

1,1,1;

2,1;

1,2;

3;

sum=4

1,1,1,1;

1,2,1;

1,1,2;

2,1,1;

3,1;

1,3;

2,2;

从上面的规律我们可以看出:当我们要求sum=4的时候的组合的数目,我们可以利用re[4]=sum(re[3]+1,re[2]+2,re[1]+1)这个表达式的意思就是:

我们在3的组合里的每一个排列后面加上1,就可以得到通过加1之后变成和为4的序列(注意这样做的前提是题目已经说明了每个数使用的次数不受限制,同一组合中哪怕是有相

同的数,只要它们的顺序不一样就是不同的组合,比如1,1,2和2,1,1)。但是这里有一个需要注意的是如果我们要求的i刚好和nums里的某个数相等,那么这个时候re[i]的个数

还要额外的+1,比如求re[3]的时候,数组里3那么就不需要re[1]+2,re[2]+1,这个时候直接一个3就行,这也是为什么很多版本里re[0]=1的原因!!!!!

0 0