leetcode:combination sum
2015-05-30 11:14
337 查看
Given a set of candidate numbers (C) 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.
Elements in a combination (a1, a2,
… , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤
… ≤ ak).
The solution set must not contain duplicate combinations.
For example, given candidate set
target
A solution set is:
------------------------------------------------------------------------------------------------------------------------
首先给定的数组元素是升序排列的,结果集合为:res; 中间结果集合为:partRes; 中间结果集合中元素和sum
所以开始时:元素和sum=0, 从第一个元素开始遍历;
partRes.push_back(当前处理元素); sum+=当前处理元素;
当 sum=target时,res.push_back(partRes);
当sum> targe时,弹出partRes中之前加进去的元素;
处理下一个元素;
具体代码如下:
法二:
灵感来自于“凑硬币”问题:
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.
Elements in a combination (a1, a2,
… , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤
… ≤ ak).
The solution set must not contain duplicate combinations.
For example, given candidate set
2,3,6,7and
target
7,
A solution set is:
[7]
[2, 2, 3]
------------------------------------------------------------------------------------------------------------------------
首先给定的数组元素是升序排列的,结果集合为:res; 中间结果集合为:partRes; 中间结果集合中元素和sum
所以开始时:元素和sum=0, 从第一个元素开始遍历;
partRes.push_back(当前处理元素); sum+=当前处理元素;
当 sum=target时,res.push_back(partRes);
当sum> targe时,弹出partRes中之前加进去的元素;
处理下一个元素;
具体代码如下:
void findSumPath(vector<int> candidates, int index, int sum, vector<int>& partRes, vector<vector<int>>& res, int target) { if (sum > target) return; if (sum == target) { res.push_back(partRes); return; } for (int i = index; i < candidates.size(); ++i) { partRes.push_back(candidates[i]); findSumPath(candidates, i, sum + candidates[i], partRes, res, target); partRes.pop_back(); } } vector<vector<int> > combinationSum(vector<int> &candidates, int target) { vector<int> partRes; vector<vector<int>> res; findSumPath(candidates, 0, 0, partRes, res, target); return res; }
法二:
灵感来自于“凑硬币”问题:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) { int alen = candidates.size(); vector<vector<int>> res; vector<int> partRes; sort(candidates.begin(), candidates.end()); process(res, partRes, candidates, alen, 0, target); return res; } void process(vector<vector<int>>& res, vector<int>& partRes, vector<int> arr, int alen, int index, int target) { if (index == alen) { if (target == 0) res.push_back(partRes); else return; } else { for (int i = 0; arr[index] * i <= target; ++i) { for (int j = 0; j < i; j++) { partRes.push_back(arr[index]); } process(res, partRes, arr, alen, index + 1, target - arr[index] * i); for (int j = 0; j < i; ++j) { partRes.pop_back(); } } } }法三:
class Solution { private: vector<vector<int> > ret; vector<int> a; public: void solve(int dep, int maxDep, int target, vector<int> &cand) { if (target < 0) return; if (dep == maxDep) { if (target == 0) { vector<int> res; for(int i = 0; i < maxDep; i++) for(int j = 0; j < a[i]; j++) res.push_back(cand[i]); ret.push_back(res); } return; } for(int i = 0; i <= target / cand[dep]; i++) { a[dep] = i; solve(dep + 1, maxDep, target - cand[dep] * i, cand); } } vector<vector<int> > combinationSum(vector<int> &candidates, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function sort(candidates.begin(), candidates.end()); a.resize(candidates.size()); ret.clear(); if (candidates.size() == 0) return ret; solve(0, candidates.size(), target, candidates); return ret; } };
相关文章推荐
- 微软100题(41)固晶机的晶元查找程序
- 几个MQ分析的链接
- ORACLE-013:oracle中kill死锁进程
- 关于0xFFFFFFFF和alpha,温故而知新
- python 调试方法
- 第十三周阅读程序一
- linux 远程连接ssh提示IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY
- ubuntu 配置NFS并挂在共享目录到目标板详解
- Gantt(甘特图)与PERT(项目计划评审技术)图
- Javascript配合jQuery实现流畅的前端验证
- 第二次冲刺 站立会议5
- 安装gnvm (windows下nodejs版本管理工具)
- mysql slave stop;语法错误
- VUE.JS学习笔记(v-model、Handling Forms)
- linux内核线程,进程,线程
- Android Studio使用记录
- 五分钟一个设计模式之策略模式
- iOS ARC项目中引用MRC文件和MRC中引用ARC文件
- ZOJ 3650(多米诺骨牌 dp + 线段树优化)
- opencv播放视频实时显示帧速(FPS),即是每秒帧数