索引:[LeetCode] Leetcode 題解索引 (C++/Java/Python/Sql)
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;}