您的位置:首页 > 其它

Combination Sum II 【leetcode】

2013-09-16 21:54 393 查看
和前一题不同的是,集合的中每个元素只能使用一次。

将元素组排序后,用数组data保存集合中不同的元素,数组limit记录出现的相应元素个数。

之后做法类似,用dfs遍历所有的可能情况,但在对数组v取值时需要考虑元素个数的上限,即数组limit对应值。

int len;
vector<int> v,limit,data;
vector<vector<int> > l;
class Solution {
public:
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
len=num.size();
sort(num.begin(),num.end());
limit.clear();
data.clear();
for(int i=0,j=0,n=0;i<len;++i)
{
if(i==0||num[i]!=num[i-1])
{
if(i!=0)limit.push_back(n);
data.push_back(num[i]);
n=1;
++j;
}
else
++n;
if(i==len-1)limit.push_back(n);
}
len=data.size();
v.clear();
l.clear();
if(len==0)return l;
v.resize(len);
hehe(0,target,data);
return l;

}

void hehe(int p,int target,vector<int > &data)
{

if(p==len)
{
if(target!=0)return;
vector<int> temp;
for(int i=0;i<len;++i)
{
for(int j=0;j<v[i];++j)
temp.push_back(data[i]);
}
l.push_back(temp);
return;

}
for(int i=0;i<=limit[p]&&data[p]*i<=target;++i)
{

v[p]=i;
hehe(p+1,target-data[p]*i,data);
}
return;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息