1. 程式人生 > >Leetcode-subsets

Leetcode-subsets

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