题目描述:
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。
示例:
nums = [1, 2, 3]
target = 4
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。
因此输出为 7。
方法1:
解题汇总
主要思路:
(1)直接递归,超时;
class Solution {
public:
void helper(vector<int>& nums,int target,int& count,int index){
if(target<0){
return;
}
if(target==0){
++count;
return;
}
for(int i=0;i<nums.size();++i){
helper(nums,target-nums[i],count,i);
}
}
int combinationSum4(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int count=0;
helper(nums,target,count,0);
return count;
}
};
方法2:
主要思路:
(1)加上记忆的递归;
class Solution {
public:
int helper(vector<int>& nums,int target,vector<int>& sign,int index){
if(target<0){//若已经小于0了
return 0;
}
if(sign[target]!=-1){//不等于-1,说明之前计算过
return sign[target];
}
if(target==0){//等于1,说明找到了一个
return 1;
}
int res=0;//存储结果
for(int i=0;i<nums.size();++i){
res+=helper(nums,target-nums[i],sign,i);//计算各个可能的结果
}
sign[target]=res;//当前的target对应的值
return res;
}
int combinationSum4(vector<int>& nums, int target) {
vector<int> sign(target+1,-1);//存储中间计算过的数据
return helper(nums,target,sign,0);
}
};
方法3:
主要思路:
(1)动态规划;
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<unsigned int> sign(target+1,0);//动态数组
sign[0]=1;//初始值
//各个可能的计算结果
for(int i=1;i<=target;++i){
for(int j=0;j<nums.size();++j){//数组可能组成的结果的数量
if(i>=nums[j]){//可组成
sign[i]+=sign[i-nums[j]];//动态转移
}
}
}
return sign[target];
}
};
986

被折叠的 条评论
为什么被折叠?



