Given a set of distinct integers, nums, 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 nums = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
//#78 Subsets
//8ms 89.70%
class Solution {
public:
void selectionSort(vector<int>& nums)
{
if(nums.empty() || nums.size() == 1) return;
for(unsigned int i=0; i<nums.size(); i++)
{
unsigned int p(i);
for(unsigned int j=i+1; j<nums.size(); j++)
{
if(nums[p] > nums[j])
{
p = j;
}
}
if(p != i)
{
int tmp(nums[i]);
nums[i] = nums[p];
nums[p] = tmp;
}
}
return;
}
vector< vector<int> > subsets(vector<int>& nums)
{
vector <vector<int> > result;
vector<int> empty_v;
result.push_back(empty_v);
if(nums.empty()) return result;
selectionSort(nums);
for(unsigned int i = 1; i < nums.size() + 1; i ++)
{ //i, the number of elements in sub array
for(unsigned int j = 0; j < nums.size() - i + 1; j ++)
{ //j, the starting point of sub array
vector<int> v;
push_vector(result, v, j, i, nums);
}
}
return result;
}
void push_vector(vector <vector<int> >& result, vector<int> v, int p, int number_left, vector<int>& nums)
{
v.push_back(nums[p]);
number_left --;
if(number_left != 0)
{
for(unsigned int j = p + 1; j < nums.size() - number_left + 1; j ++)
{
push_vector(result, v, j, number_left, nums);
}
}
else
{
//cout << "Pushing a combination back...\n";
//for(unsigned int i=0; i<v.size(); i++)
//{
// cout << v[i];
//}
//cout << endl;
result.push_back(v);
}
return;
}
};