[Leetcode]#78 Subsets

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章