[leetcode] 040. Combination Sum II (Medium) (C++)
2015-08-08 08:33
435 查看
索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql)
Github: https://github.com/illuz/leetcode
代码(github):https://github.com/illuz/leetcode
还要考虑解集里不能有相同的解。
Github: https://github.com/illuz/leetcode
040. Combination Sum II (Medium)
链接:
题目:https://leetcode.com/problems/combination-sum-ii/代码(github):https://github.com/illuz/leetcode
题意:
跟 039 一样(给出一些正整数集合,以及一个目标数,从集合中选择一些数使得它们的和等于目标数),不过不能选重复的数。分析:
同样暴力 DFS,不过要考虑重复会复杂点。还要考虑解集里不能有相同的解。
代码:
/* * Author: illuz <iilluzen[at]gmail.com> * File: AC_dfs_n!.cpp * Create Date: 2015-01-01 11:35:04 * Descripton: just as the version I */ #include <bits/stdc++.h> using namespace std; const int N = 0; class Solution { private: void dfs(vector<vector<int> > &ans, vector<int> &single, vector<int> &candi, int cur, int rest) { int sz = candi.size(); if (rest == 0) { // to avoid [[1,1,1], 2] if (!single.empty() && cur < sz && single[single.size() - 1] == candi[cur]) return; ans.push_back(single); return; } if (sz <= cur || rest < 0) return; // choose cur single.push_back(candi[cur]); dfs(ans, single, candi, cur + 1, rest - candi[cur]); single.pop_back(); // don't choose cur // not contain duplicate combinations if (!single.empty() && single[single.size() - 1] == candi[cur]) return; dfs(ans, single, candi, cur + 1, rest); } public: vector<vector<int> > combinationSum2(vector<int> &num, int target) { vector<vector<int> > ans; vector<int> single; sort(num.begin(), num.end()); dfs(ans, single, num, 0, target); return ans; } }; int main() { int tar; int n; Solution s; cin >> n >> tar; vector<int> v(n); for (int i = 0; i < n; i++) cin >> v[i]; vector<vector<int> > res = s.combinationSum2(v, tar); for (auto &i : res) { for (auto &j : i) cout << j << ' '; puts(""); } return 0; }
相关文章推荐
- [LeetCode] 039. Combination Sum (Medium) (C++)
- C语言的条件运算符
- C++类内存分布
- c++动态内存分配与释放
- c++内存中字节对齐问题详解
- const、volatile、mutable的用法
- C语言函数-指针
- C语言字符串定义
- C语言数组练习相关
- 内联函数,构造函数,静态函数都不能是虚函数
- C语言多级指针
- C++模板函数的小问题解决
- C语言函数相关
- C++中overload,override,overwrite的区别详细解析
- C++多态调用和继承内存分布
- C++STL之迭代器2
- 20、C语言和设计模式(观察者模式)
- C++STL之迭代器
- 19、C语言和设计模式(桥接模式)
- 18、C语言和设计模式(建造者模式)