Combination Sum
原题链接Combination Sum
给定一个无重复项的序列,找到所有和是target的集合,每个元素可以使用多次。
可以用深度优先(dfs),对于某个元素都有两种选择,一种是选择当前元素至少一次,一种是不选择当前元素,所以在查找集合时要分开处理。比如说,当前元素下标为1,那么
- 选择该元素,然后仍然从位置1开始继续进行(这保证了下次的元素下标仍然是1,还可以决定选或不选,即至少选择一次)
- 不选择该元素,从位置2开始继续进行
这两种情况都可以用一个循环来做,从当前位置开始遍历给定序列,对于每个元素,如果选择了那么就是情况1,如果没有选择就是情况2
代码如下
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
/* 按递增排序,递归时可以根据当前要选择的元素和target大小决定是否还需要继续 */
std::sort(candidates.begin(), candidates.end());
/* 结果 */
vector<vector<int>> res;
/* 当前找到的集合 */
vector<int> cur;
dfs(candidates, target, 0, cur, res);
return res;
}
private:
/* 深度优先查找所有满足条件的集合,target代表和要求总和的差,为0表示找到一个集合 */
void dfs(vector<int>& candidates, int target, int idx, vector<int>& cur, vector<vector<int>>