题意:
给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复)。
思路:
DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
DFS(,nums,tmp);
return ans;
} void DFS(int pos,vector<int>& nums,vector<int>& seq)
{
ans.push_back(seq);
for( ; pos<nums.size(); pos++)
{
seq.push_back(nums[pos]);
DFS(pos+,nums,seq); //放
seq.pop_back();
}
}
private:
vector<vector<int>> ans;
vector<int> tmp;
};
AC代码
迭代解决:由于集合中的元素是不可能出现相同的,所以子集的个数必定是2n个,即每个数字有可取可不取这两种选择。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size();
for(int i=; i<(<<n); i++)
{
vector<int> tmp;
for(int j=; j<n; j++)
{
if((i>>j)&)
tmp.push_back(nums[j]);
}
ans.push_back(tmp);
}
return ans;
}
private:
vector<vector<int>> ans;
};
AC代码
如果集合中有相同的元素的话,解法同LEETCODE COMBINATION SUM II (DFS),主要在于去重,而去重的技术一样。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
DFS(,nums,tmp);
ans.push_back(vector<int>());
return ans;
} void DFS(int pos,vector<int>& nums,vector<int>& seq)
{
if(pos>=nums.size())
{
if(!seq.empty()) ans.push_back(seq);
return ;
}
for( ; pos<nums.size(); pos++)
{
seq.push_back(nums[pos]);
DFS(pos+,nums,seq); //放
seq.pop_back(); while(pos+<nums.size() && nums[pos]==nums[pos+]) pos++;//主要在这
}
DFS(pos+,nums,seq);
}
private:
vector<vector<int>> ans;
vector<int> tmp;
};
AC代码