解题思路:
1.回溯法,不重复子集在同一层解空间树上不能选择同一个元素,但是一个树枝上可以选择同一个,于是在for循环中加入一个条件就是后一个元素不等于前一个元素。
//在解空间树的同一层不同选相同元素,在统一树枝上可以选
class Solution {
public:
vector<vector<int> > res;//保存结果
vector<int> path;
void backtrace(vector<int>&nums,int index)
{
if(index > nums.size())
{
return;
}
res.push_back(path);
for(int i = index;i<nums.size();i++)
{
if(i>index&&nums[i]==nums[i-1]) continue;//判断不等
path.push_back(nums[i]);
backtrace(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
backtrace(nums,0);
return res;
}
};
第二种方法:
在暴力递归上面加一个set去重,对于每一个元素,对path可以选择加入此元素,也可以选择不加此元素。
class Solution {
public:
set<vector<int>> st;
vector<vector<int> > res;
void dfs(vector<int>& nums,int index,vector<int> path)
{
if(index == nums.size())
{
st.insert(path);
return;
}
vector<int> temp1 = path;
dfs(nums,index+1,temp1);//不选择这个值
vector<int> temp=path;
temp.push_back(nums[index]);
dfs(nums,index+1,temp);//选择这个值
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> path;
dfs(nums,0,path);
for(auto it = st.begin();it!=st.end();it++)
{
res.push_back(*it);
}
return res;
}
};