给定一个集合,求出这个集合的所有子集,比如:集合{1,2,3},子集为{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。
解法一:递归void subsets(vector<vector<int>> &res, vector<int> &path,vector<int> &nums, int start)
{
res.push_back(path);
for (int i = start; i < nums.size(); ++i)
{
path.push_back(nums[i]);
subsets(res, path, nums, i + 1);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums)
{
vector<vector<int>> res;
vector<int> path;
subsets(res, path, nums, 0);
return res;
}
解法二:循环vector<vector<int>> subsets(vector<int>& nums)
{
vector<vector<int>> res = { {} };
for (int i = 0; i < nums.size(); ++i)
{
int size = res.size();
for (int j = 0; j < size; ++j)
{
res.push_back(res[j]);
res[j].push_back(nums[i]);
}
}
return res;
}
解法三:位向量vector<vector<int>> subsets(vector<int>& nums)
{
vector<vector<int>> res;
if (nums.empty())
return res;
int size = nums.size();
int num = pow(2, size);
res.resize(num);
for (int i = 0; i < size; ++i)
{
for (int j = 0; j < num; ++j)
{
if ((j >> i) & 1)
{
res[j].push_back(nums[i]);
}
}
}
return res;
}