无重复序列
题意:给定一组无重复数值的序列,求该序列的所有子集;
传送门
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
DFS+回溯:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ret;
vector<int> tmp;
function<void(int)> dfs = [&](int id){
ret.push_back(tmp);
for (int i = id; i < nums.size(); ++i) {
tmp.push_back(nums[i]);
dfs(i+1);
tmp.pop_back();
}
};
dfs(0);
return ret;
}
迭代,根据二进制位的0、1记录组合的情况:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ret;
vector<int> tmp;
int n = nums.size();
for (int mask = 0; mask < (1<<n); ++mask) {
tmp.clear();
for (int i = 0; i < n; ++i)
if (mask & (1<<i))
tmp.push_back(nums[i]);
ret.push_back(tmp);
}
return ret;
}
重复序列
题意:给定一组有重复数值的序列,求该序列的所有子集;
传送门
DFS+回溯:
vector<vector<int>> subsetsWithDup(vector<int> &nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> ret;
vector<int> tmp;
function<void(int)> dfs = [&](int id){
ret.push_back(tmp);
for (int i = id; i < nums.size(); ++i) {
if (i > id && nums[i] == nums[i-1])
continue;
tmp.push_back(nums[i]);
dfs(i+1);
tmp.pop_back();
}
};
dfs(0);
return ret;
}
迭代,根据二进制位的0、1记录组合的情况:
vector<vector<int>> subsetsWithDup(vector<int> &nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> ret;
vector<int> tmp;
int n = nums.size();
for (int mask = 0; mask < (1<<n); ++mask) {
tmp.clear();
bool flag = true;
for (int i = 0; i < n; ++i) {
if (mask & (1<<i)) {
// 第i-1位和第i位相同且当前子集不包含i-1位,说明有重复
if (i && !(mask & (1<<(i-1))) && nums[i] == nums[i-1]) {
flag = false;
break;
}
tmp.push_back(nums[i]);
}
}
if (flag) ret.push_back(tmp);
}
return ret;
}