Leetcode-subsets
阿新 • • 發佈:2017-06-21
empty art san 使用 str distinct 一次 1.4 etc
題目:
Given a set of distinct integers, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,3]
, a solution
is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
分析:
這道題考的知識點是組合問題。
因為每一個子集都要以遞增的形式排列。所以最好先將S排序,然後再求全部的子集。
我的方法是笨方法,如求S= [1, 2, 3]的全部子集時:
1、首先對S排序,當然排完序還是S= [1, 2, 3];
2、計算元素個數為[S.size() - 1] = 2的全部子集,設為S2, 則S2 = {[1, 2], [1, 3], [2, 3]}
3、計算元素個數為[S2.size() - 1] = 1的全部子集,設為S1。則S1 = {[1], [2], [3]}
4、設空集為S0。 則全部的字串的字集為 {S、S2、S1、 S0}
這種方法能夠使用遞歸實現。可是假設S的元素個數比較大的時候,使用遞歸會出"Time Limit Exceeded"的錯誤,所以不能使用遞歸實現。
以下是我的代碼,我會繼續思考好的方法。
#include "stdafx.h" #include <iostream> #include <vector> #include <set> #include <algorithm> using namespace std; void maxSubsets(const vector<int> &S, set<vector<int> > &tmpSet) { for (int i = 0; i < S.size(); i++) { vector<int> subset; for (int j = 0; j < S.size(); j++) { if (j != i) subset.push_back(S[j]); } tmpSet.insert(subset); } } vector<vector<int> > subsets(vector<int> &S) { sort(S.begin(), S.end()); set<vector<int> > vecSet; vector<vector<int> > allSubset; vecSet.insert(S); // 記錄下全集 allSubset.push_back(S); //子集元素的個數從S.size()個到1個,每運行完一次循環,子集元素個數減1 for ( int i = 0; i < S.size() - 1; i++ ) { set<vector<int> > tmpSet; // 獲取下一級的全部子集 for (set<vector<int> >::iterator iter = vecSet.begin(); iter != vecSet.end(); iter++) maxSubsets(*iter, tmpSet); // 記錄子集 for (set<vector<int> >::iterator iter = tmpSet.begin(); iter != tmpSet.end(); iter++) allSubset.push_back(*iter); vecSet.clear(); vecSet.insert(tmpSet.begin(), tmpSet.end()); } // 記錄空集 vector<int> empty; allSubset.push_back(empty); return allSubset; } int _tmain(int argc, _TCHAR* argv[]) { vector<int> data; data.push_back(1); data.push_back(2); data.push_back(3); data.push_back(4); vector<vector<int> > res = subsets(data); for (int i = 0; i < res.size(); i++) { vector<int> subset = res[i]; for (int j = 0; j < subset.size(); j++) cout << subset[j] << " "; cout << endl; } cout << "Size: " << res.size() << endl; return 0; }
Leetcode-subsets