您的位置:首页 > 其它

leetcode - Combination Sum II

2013-03-26 19:44 501 查看
题目描述:点击此处

class Solution {
public:
int * cts;
void getResult(vector<vector<int>> & rlt, vector<int> current, vector<int>* tags, int target){
if (target <= 0)
return;
int maxN = 1000000000;
if (!current.empty())
maxN = *(current.end()-1);
vector<int>::iterator vi;
for (vi = tags[target].begin(); vi!=tags[target].end() && *vi<=maxN; vi++){
if (!current.empty()){
int ct = 1;
vector<int>::iterator cti = current.end()-1;
while (cti+1!=current.begin() && *cti==*vi){
ct++;
cti--;
}
if (ct>cts[*vi])
continue;
}
vector<int> tvi = current;
tvi.push_back(*vi);
if (target-*vi==0){
vector<int> rr;
vector<int>::iterator ii;
for (ii=tvi.end()-1; ii+1 != tvi.begin(); ii--){
rr.push_back(*ii);
}
rlt.push_back(rr);
}
else getResult(rlt, tvi, tags, target-*vi);
}
}
vector<vector<int> > combinationSum2(vector<int> &num, int target){
// Start typing your C/C++ solution below
// DO NOT write int main() function
sort (num.begin(), num.end());
vector<int>::iterator vi;
vector<int> * tags = new vector<int>[target+1]();
cts = new int[target+1];
for (int i=0; i<=target; i++)
cts[i]=0;
tags[0].push_back(0);
for (vi=num.begin(); vi!=num.end(); vi++){
if (*vi<=target)
cts[*vi]++;
else break;
for (int i=target; i>=*vi; i--){
if (!tags[i-*vi].empty() && find(tags[i].begin(), tags[i].end(),*vi)==tags[i].end())
tags[i].push_back(*vi);
}
}
vector<vector<int>> rlt;
vector<int> current;
getResult(rlt, current, tags, target);
delete[]cts;
delete []tags;
return rlt;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: