题目描述
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)
说明:解集不能包含重复的子集。
方法一
利用回溯法,设置三个数据结构,为二维的结果数组,一维的暂存数组
每一次暂存数组填满后,回溯一位,如果达到指定的长度,则填入结果数组
c++实现
class Solution {
private:
int n,l;
vector<vector<int>>ans;
vector<int> cur;
public:
vector<vector<int>> subsets(vector<int>& nums) {
n=nums.size();
for(l=0;l<=n;l++){
cur.clear();
backtrace(0,cur,nums);
}
return ans;
}
void backtrace(int start,vector<int> &curr,vector<int>& nums){
if(curr.size()==l){
ans.push_back(curr);
}
for(int i=start;i<n;i++){
curr.push_back(nums[i]);
backtrace(i+1,curr,nums);
curr.pop_back();
}
}
};
提升
nums允许包含重复元素
思路
首先要对数组排序,保证相同元素相邻,其次跳过相同元素,去掉同层的相同元素即可
c++实现
class Solution {
private:
vector<vector<int>> ans;
vector<int> cur;
int n,l;
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
n=nums.size();
sort(nums.begin(),nums.end());
for(l=0;l<=n;l++){
cur.clear();
backtrace(0,cur,nums);
}
return ans;
}
void backtrace(int start,vector<int>& curr,vector<int>& nums){
if(curr.size()==l){
ans.push_back(curr);
}
for(int i=start;i<n;i++){
curr.push_back(nums[i]);
backtrace(i+1,curr,nums);
curr.pop_back();
while(i+1<n&&nums[i+1]==nums[i]){
i++;
}
}
}
};