首页 > 学院 > 开发设计 > 正文

【LeetCode】39. Combination Sum

2019-11-06 08:10:14
字体:
来源:转载
供稿:网友

题目描述

Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:

All numbers (including target) will be positive integers.The solution set must not contain duplicate combinations.

For example, given candidate set[2, 3, 6, 7] and target 7, A solution set is:

[ [7], [2, 2, 3]]

解题思路

回溯+剪枝 先对candidates升序排序,然后,遍历所有candidates,如果小于target,就可以加入当前的求解队列中。然后,更新target,递归向下查找。 那么,如何确保找到的解没有重复呢? 首先,题目说明给出的candidates是没有重复的,这个不用考虑。 我们可以通过让求解队列升序排序来做剪枝。由于candidates本身有序,我们只需要每次递归时传入一个index,确保下一轮递归中从index出开始查找即可。 这样,就不会出现如下的重复情况

对于candidates = [2, 3] 和 target = 7[2, 2, 3][2, 3, 2][3, 2, 2]

AC代码

class Solution {public: void bc(vector<vector<int>>& ans, vector<int>& cur,const vector<int>& candidates, int target, int beginIdx) { if (target == 0) { ans.push_back(cur); return; } for (int idx = beginIdx; idx < candidates.size(); ++idx) { if (candidates[idx] <= target) { cur.push_back(candidates[idx]); bc(ans, cur, candidates, target - candidates[idx], idx); cur.pop_back(); } } } vector<vector<int>> combinationSum(vector<int>& candidates, int target) { sort(candidates.begin(), candidates.end()); vector<vector<int>> ans; vector<int> cur; bc(ans, cur, candidates, target, 0); return ans; }};
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表