leetcode 90. Subsets II (枚举子集)

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example, If nums = [1,2,2], a solution is:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

思路:

复习(?)一下 枚举子集的三种写法

(还有种更飘逸的...先不写了orz

这道题我用位向量法A的。。

 1/* ***********************************************
 2Author :111qqz
 3Created Time :2017年04月05日 星期三 17时15分34秒
 4File Name :90.cpp
 5************************************************ */
 6class Solution {
 7public:
 8    set<vector<int> >se;
 9    int B[1005];
10    vector <vector<int> >res;
11    void get_subset(int n,int *B,int cur,vector<int>& nums)
12    {
13//	cout<<"cur:"<<cur<<endl;
14	if (cur==n) //from 0
15	{
16	    vector<int>tmp;
17	    for ( int i = 0 ; i < n ; i++)
18		if (B[i]) tmp.push_back(nums[i]);
 1	    sort(tmp.begin(),tmp.end());
 2	    int siz = tmp.size();
 3//	    for ( int i = 0 ; i < siz ; i++) printf("%d ",tmp[i]);printf("\n");
 4	    se.insert(tmp);
 5	    return;
 6	}
 7	B[cur] = 1;
 8	get_subset(n,B,cur+1,nums);
 9	B[cur] = 0;
10	get_subset(n,B,cur+1,nums);
11    }
12    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
13	int siz = nums.size();
14	if (siz==0) return res;
15	get_subset(siz,B,0,nums);
16	for ( auto &it : se)
17	{
18	    res.push_back(it);
19	}
20	return res;
21    }
22};