已知一组数(其中无重复元素),求这组数可以组成的所有子集。结果中不可有重复子集。
例如: nums[]=[1,2,3]
结果为:[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]
回溯法的实现代码如下:
#include<vector>
#include<stdio.h>
class Solution
{
public:
Solution() {};
~Solution() {};
std::vector<std::vector<int>> subsets(std::vector<int>& nums)
{
std::vector<int> item;
std::vector<std::vector<int>> result;
result.push_back(item);
generate(0, nums, item, result);
return result;
}
private:
void generate(unsigned int i, std::vector<int>& nums, std::vector<int>& item, std::vector<std::vector<int>>& result)
{
if (i>=nums.size())
{
return;
}
item.push_back(nums[i]);
result.push_back(item);
generate(i + 1, nums, item, result);
item.pop_back();
generate(i + 1, nums, item, result);
}
};
int main()
{
std::vector<int> nums;
nums.push_back(1);
nums.push_back(2);
nums.push_back(3);
std::vector<std::vector<int>> result;
Solution solve;
result = solve.subsets(nums);
for (unsigned int i = 0; i < result.size(); i++)
{
if (result[i].size()==0)
{
printf("[]");
}
for (unsigned int j = 0; j < result[i].size(); j++)
{
printf("[%d]", result[i][j]);
}
printf("\n");
}
return 0;
}
运行结果为:
[]
[1]
[1][2]
[1][2][3]
[1][3]
[2]
[2][3]
[3]
位运算的代码如下:
#include<vector>
class Solution
{
public:
Solution() {};
~Solution() {};
std::vector<std::vector<int>> subsets(std::vector<int>& nums)
{
std::vector<std::vector<int>> result;
int all_set = 1 << nums.size();
for (unsigned int i = 0; i < all_set; i++)
{
std::vector<int> item;
for (unsigned int j = 0; j < nums.size(); j++)
{
if (i&(1<<j))
{
item.push_back(nums[j]);
}
}
result.push_back(item);
}
return result;
}
};
int main()
{
std::vector<int> nums;
nums.push_back(1);
nums.push_back(2);
nums.push_back(3);
std::vector<std::vector<int>> result;
Solution solve;
result = solve.subsets(nums);
for (unsigned int i = 0; i < result.size(); i++)
{
if (result[i].size() == 0)
{
printf("[]");
}
for (unsigned int j = 0; j < result[i].size(); j++)
{
printf("[%d]", result[i][j]);
}
printf("\n");
}
return 0;
}
运行结果为:
[]
[1]
[2]
[1][2]
[3]
[1][3]
[2][3]
[1][2][3]