谢岗镇仿做网站,医药企业vi设计,WordPress指定用户组可见,win7云主机怎么做网站39. 组合总和 文档链接#xff1a;[代码随想录] 题目链接#xff1a;39. 组合总和 题目#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target #xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 #xff0c;并以列表形…39. 组合总和 文档链接[代码随想录] 题目链接39. 组合总和 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target 找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同则两种组合是不同的。 对于给定的输入保证和为 target 的不同组合数少于 150 个。 注意 1.如果不进行剪枝的话这个回溯很简单 2.考虑如何进行剪枝
class Solution {
private:vectorvectorint result;vectorint path;void backtracking(vectorint candidates, int target, int index, int sum){if(sum target){result.push_back(path);return ;}else if(sum target){return ;}for(int i index;i candidates.size(); i){path.push_back(candidates[i]);sum candidates[i];backtracking(candidates, target, i, sum);sum - candidates[i];path.pop_back();}}public:vectorvectorint combinationSum(vectorint candidates, int target) {backtracking(candidates, target, 0, 0);return result;}
};class Solution {
private:vectorvectorint result;vectorint path;void backtracking(vectorint candidates, int target, int index, int sum){if(sum target){result.push_back(path);return ;}else if(sum target){return ;}for(int i index;i candidates.size() sum candidates[i] target; i){path.push_back(candidates[i]);sum candidates[i];backtracking(candidates, target, i, sum);sum - candidates[i];path.pop_back();}}public:vectorvectorint combinationSum(vectorint candidates, int target) {result.clear();path.clear();sort(candidates.begin(),candidates.end());backtracking(candidates, target, 0, 0);return result;}
};40.组合总和II 文档链接[代码随想录] 题目链接 40.组合总和II 题目 给定一个候选人编号的集合 candidates 和一个目标数 target 找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意解集不能包含重复的组合。 注意 1.把所有组合求出来再用set或者map去重这么做很容易超时 2.要分清去重去的是哪个方向的重
class Solution {
private:vectorvectorint result;vectorint path;void backtracking(vectorint candidates, int target, int index, int sum, vectorbool used){if(sum target){result.push_back(path);return;}for(int i index; i candidates.size(); i){if( i 0 candidates[i] candidates[i - 1] used[i - 1] false){continue;}sum candidates[i];if(sum target){break;}path.push_back(candidates[i]);used[i] true;backtracking(candidates, target, i 1, sum, used);used[i] false;sum - candidates[i];path.pop_back();}}
public:vectorvectorint combinationSum2(vectorint candidates, int target) {vectorbool used(candidates.size(), false);result.clear();path.clear();sort(candidates.begin(), candidates.end());backtracking(candidates, target, 0, 0, used);return result;}
};131.分割回文串 文档链接[代码随想录] 题目链接131.分割回文串 题目 给定一个字符串 s将 s 分割成一些子串使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] 注意 跟之前的不太一样 只有符合回文字符串条件的才会被加到path里
class Solution {
private:vectorvectorstring result;vectorstring path;void backtracking(const string s, int index){if(index s.size()){result.push_back(path);return;}for(int i index; i s.size(); i){if(isString(s, index, i)){string str s.substr(index, i - index 1);path.push_back(str);}else{continue;}backtracking(s, i 1);path.pop_back();}}bool isString(const string s, int start, int end){for (int i start, j end; i j; i, j--) {if (s[i] ! s[j]) {return false;}}return true;}
public:vectorvectorstring partition(string s) {result.clear();path.clear();backtracking(s, 0);return result;}
};