Combination Sum
来源:互联网 发布:流程优化与再造 编辑:程序博客网 时间:2024/05/01 03:07
class Solution {public: vector<vector<int> > combinationSum(vector<int> &candidates, int target) { sort(candidates.begin(), candidates.end()); vector<vector<int> > result; vector<int> path; int sum = 0; dfs(candidates, 0, sum, path, result, target); return result; } void dfs(vector<int> &candidates, int pos, int &sum, vector<int> &path, vector<vector<int> > &result, int target) { if(sum == target) { result.push_back(path); return; } else if(sum > target) return; else { for(int i=pos; i<candidates.size(); ++i) { path.push_back(candidates[i]); sum += candidates[i]; dfs(candidates, i, sum, path, result, target); sum -= candidates[i]; path.pop_back(); } } }};
9.06非递归实现: 参考 http://blog.csdn.net/starmsg/article/details/39085143
注意:如果每次可以push相同的元素入栈,则无法通过
s.peek() == currentPath.peek()
区分是否有新的元素push到stack中,此时可以在path中记录stack top的index而非实际的元素,来标记是否有新的元素push。
新的判断条件变成了
<span style="color:#333333;">(stack.size()-1) == path.back()</span>
class Solution {public: vector<vector<int> > combinationSum(vector<int> &candidates, int target) { vector<vector<int> > result; if(candidates.size() == 0) return result; sort(candidates.begin(), candidates.end()); for(int start = 0; start < candidates.size(); start++) dfsWithStack(candidates, result, start, target); return result; } void dfsWithStack(vector<int> &candidates, vector<vector<int> > &result, int startIdx, int target) { vector<int> path; vector<int> stack; int sum = 0; if(sum + candidates[startIdx] <= target) { stack.push_back(startIdx); } int count = 0; while(!stack.empty()) { int idx = stack.back(); path.push_back(stack.size()-1); sum += candidates[idx]; if(sum == target) { vector<int> res; for(int i=0; i<path.size(); i++) res.push_back(candidates[stack[path[i]]]); result.push_back(res); } else if(sum < target) { for(size_t i = idx; i < candidates.size(); i++) { if(sum + candidates[i] <= target) { stack.push_back(i); } } } while(!stack.empty() && (stack.size()-1) == path.back()) { sum -= candidates[stack.back()]; path.pop_back(); stack.pop_back(); } count++; } }};
0 0
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- Combination Sum
- 2011斯坦福大学iOS应用开发教程学习笔记(第六课)故事版
- 2014微软编程一小时 题目2 : Longest Repeated Sequence Java实现
- 最短路&差分约束题集
- C/C++中多维数组做参数情况的详细解释
- java设计模式之工厂模式Factory
- Combination Sum
- 一步一步学java-1
- win8.1黑屏问题
- 2011斯坦福大学iOS应用开发教程学习笔记(第七课)Pad和iPhone的通用程序
- MyEclipse中使用Junit--Test Case
- 一道笔试题
- 鸟哥LINUX学习笔记(4)
- Git的简单入门
- 2011斯坦福大学iOS应用开发教程学习笔记(第八课)viewController生命周期