給定一個無重復元素的陣列 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]
]
提示:
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每個元素都是獨一無二的,
1 <= target <= 500
解題思路:
這道題是典型可以使用回溯搜索的方法,當然如果加一些剪枝的判斷效率會更高,這里深度優先是根據是否選擇當前的數,由于可以重復使用數,所以選擇當前數下一次dfs還是當前數,不選擇當前數,下一次就是index+1,代碼如下:
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int> res;
dfs(candidates, target, ans, res, 0);
return ans;
}
void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& res, int index){
if(index == candidates.size()){//如果超過了長度
return;
}
if(target == 0){//如果結果正好滿足等于最后的值
ans.emplace_back(res);
return;
}
//如果不選擇當前數
dfs(candidates, target, ans, res, index + 1);
//如果選擇當前數
if(target - candidates[index] >= 0){
res.emplace_back(candidates[index]);
dfs(candidates, target - candidates[index], ans, res, index);
res.pop_back();
}
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/2807.html
標籤:其他
