Wednesday, July 29, 2015

078 - Subsets

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],
  []
]

Hide Tags
Array Backtracking Bit Manipulation

注意要求,需要先对输入的数据排个序。
然后依次组合即可。
至于bit操作,应该是每个bit位表示输入的vector里的对应的数字是否被选中,
但是需要考虑bit的长短,移位会不会溢出等等,实际上并不是非常完美的一个选择。
讨论区里有用bit解这道题的,case应该是都通过了,但这个问题还是存在的。(参考帖子

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> rst;
        vector<int> buf;
        rst.push_back(buf);


        int sz = nums.size();
        if(sz)
        {
            sort(nums.begin(), nums.end());
            for(int nn=1; nn<=sz; ++nn)  //依次创建从1一个元素到sz个元素的所有组合
                build(nums, sz, rst, buf, nn, 0, 0);
        }
        return rst;
    }

    void build(vector<int>& nums, int sz, vector<vector<int>>& rst,
                    vector<int>& buf, int count, int taken, int start)
    {
        if(taken==count)
            rst.push_back(buf);
        else
        {
            int end=sz-count+taken;
            for(int ii=start; ii<=end; ++ii)
            {
                buf.push_back(nums[ii]);
                build(nums, sz, rst, buf, count, taken+1, ii+1);
                buf.pop_back();
            }
        }
        return;
    }

};


8 ms.




No comments:

Post a Comment