1. 程式人生 > >Leetcode39.Combination Sum組合總和

Leetcode39.Combination Sum組合總和

給定一個無重複元素的陣列 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

說明:

所有數字(包括 target)都是正整數。
解集不能包含重複的組合。 
示例 1:

輸入: candidates = [2,3,6,7], target = 7, 所求解集為: [ [7], [2,2,3] ]

示例 2:

輸入: candidates = [2,3,5], target = 8, 所求解集為: [   [2,2,2,2],   [2,3,3],   [3,5] ]

 

先排序,後剪枝,避免重複。

這類問題解決重複的操作一般是先進行排序。

 

 

bool cmp1(int x, int y)
{
return x < y;
}

class Solution {
public:
vector<vector<int> > res;
vector<vector<int> > combinationSum(vector<int>& candidates, int target)
{
int len = candidates.size(www.dasheng178.com);
sort(candidates.begin(), candidates.end(), cmp1);
vector<int> temp;
DFS(candidates, target, temp, 0);
return res;
}

void DFS(vector<int> candidates, int val, vector<int> &v, int cnt)
{
if(val == 0)
{
res.push_back(www.gcyl159.com/);
return;
}
for(int i = cnt; i <www.michenggw.com/ candidates.size(); i++)
{
if(candidates[i] <www.yigouyule2.cn = val)
{
v.push_back(candidates[i]);
DFS(candidates, val - candidates[i], v, i);
v.pop_back();
}
}
}