Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
方法一:回溯法
class Solution {
public:
vector<vector<int>>result;
vector<int>tempresult;
int len;
vector<vector<int>> subsets(vector<int>& nums) {
len=nums.size();
dfs(0,nums);
return result;
}
void dfs(int index,vector<int>& num){
result.push_back(tempresult);
for(int i = index; i < len;i++){
tempresult.push_back(num[i]);
dfs(i+1,num);
tempresult.pop_back();
}
}
};
非递归写法:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ans;
vector<int>tempans;
ans.push_back({});
int left = 0, right;
for(int i = 0; i < nums.size(); ++ i){
right = ans.size();
for(int j = left; j < right; ++ j){
tempans = ans[j];
tempans.push_back(nums[i]);
ans.push_back(tempans);
}
}
return ans;
}
};
方法二:二进制法,用二进制表示{0,1,2,3...n-1}的子集,从左往右,第i位表示元素i是否在S中
class Solution {
public:
vector<vector<int>>result;
vector<int>tempresult,num;
int len;
vector<vector<int>> subsets(vector<int>& nums) {
num=nums;
len=num.size();
for(int i = 0; i< (1<<len);i++)
my_subset(i);
return result;
}
void my_subset(int index){
tempresult.clear();
for(int i = 0; i < len; i++)
if((1<<i) & index)
tempresult.push_back(num[i]);
result.push_back(tempresult);
}
};