C++ 用回溯法和位运算求子集

已知一组数(其中无重复元素),求这组数可以组成的所有子集。结果中不可有重复子集。
例如: 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]

发布了61 篇原创文章 · 获赞 47 · 访问量 1593

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/104823553