39. Combination Sum
来源:互联网 发布:windows服务管理工具 编辑:程序博客网 时间:2024/06/13 21:33
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]]
这仍然是一个递归回溯问题,遵循以下几个步骤:
1)按照测试用力画出递归树(注意递归过程的变化);
2)根据递归的变的部分抽象出递归所用参数;
3)在递归树中考虑清楚递归终止条件和递归过程。
解题代码
class Solution {private: vector<vector<int>> res; void generateCombinations(vector<int>& candidates, int start, int target, vector<int> &c){ if (start == candidates.size()) return; // 遍历完了,退出 // 递归终止,找到组合的情况 if (target == 0){ res.push_back(c); return; } // 递归过程 for (int i = start; i < candidates.size(); i++){ // 考察当前元素有没有可能放到答案中,当前考察元素已经超过target直接考察下一个元素 if (target < candidates[i]) continue; c.push_back(candidates[i]); // 递归过程:因为可重复取值,因此还是尝试从i开始继续寻找 generateCombinations(candidates, i, target - candidates[i], c); c.pop_back(); // 递归回溯,为下一次递归推入做准备 } return; }public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { res.clear(); // 边界条件 if (candidates.empty()) return res; vector<int> c; generateCombinations(candidates, 0, target, c); return res; }};
测试代码
class TestHelper{ Solution s;public: void run(){ int candiate[] = {8,7,4,3},target = 11; vector<int> vec(candiate, candiate + 4); Utils::showVecInfo(vec); vector<vector<int>> res = s.combinationSum(vec, target); // 显示结果信息 Utils::showVecInfo(res); }};
所用到的工具
namespace Utils { // 显示vector信息 void showVecInfo(vector<int> & v) { cout << endl << "vector : [ "; for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << " ]" << endl; } // 显示vector信息 void showVecInfo(vector<vector<int>> & v) { cout << endl << "vector<vector<int>> : " << endl; cout << "\t\t\t[" << endl; for (vector<vector<int>>::iterator iter = v.begin(); iter != v.end(); iter++){ vector<int> combination = *iter; cout << "\t\t\t [ "; for (vector<int>::iterator it = combination.begin(); it != combination.end(); it++) { cout << *it << " "; } cout << "]" << endl; } cout << "\t\t\t]" << endl; }}
运行结果
vector : [ 8 7 4 3 ]vector<vector<int>> : [ [ 8 3 ] [ 7 4 ] [ 4 4 3 ] ]请按任意键继续. . .
阅读全文
0 0
- 39. Combination Sum && 40. Combination Sum II
- 39. Combination Sum &&40. Combination Sum II
- [LeetCode]39.Combination Sum
- LeetCode --- 39. Combination Sum
- LeetCode 39.Combination Sum
- [Leetcode] 39. Combination Sum
- 39. Combination Sum
- 39. Combination Sum
- Leetcode-39.Combination Sum
- LeetCode 39. Combination Sum
- [LeetCode]39. Combination Sum
- 39. Combination Sum LeetCode
- [leetcode] 39. Combination Sum
- 39. Combination Sum
- 39. Combination Sum
- leetcode 39. Combination Sum
- 【leetcode】 39. Combination Sum
- 39. Combination Sum(backtracking)
- Spring源码schema.zip文件找不到
- HBase介绍、搭建、环境、安装部署
- php 根据时间获取二十四节气,返回json
- LK光流金字塔算法分析
- 连接
- 39. Combination Sum
- ZOJ-3933-Team Formation【二分图最佳匹配】【KM】
- ZOJ 1093 Monkey and Banana(dp)
- Java集合归纳-<一>集合概述
- linux基础入门
- .NET Web开发技术简单整理(转)
- 在gdb中显示源码(gdbtui使用方法)
- Java虚拟机
- Composer