有重复元素的集合求子集

已知一组数(其中有重复元素),求这组数可以组成的所有子集,结果中无重复的子集。
例如:nums[]=[2,1,2,2]
结果为:[[],[1],[1,2],[1,2,2],[1,2,2,2],[2],[2,2],[2,2,2]]
注意:[2,1,2]与[1,2,2]是重复的集合。

#include<vector>
#include<algorithm>
class Solution
{
public:
 Solution() {};
 ~Solution() {};
 std::vector<std::vector<int>> subsetsWithDup(std::vector<int>& nums)
 {
  std::vector<std::vector<int>> result;
  std::vector<int> item;
  std::sort(nums.begin(), nums.end());
  result.push_back(item);
  generate(0, nums, result, item);
  return result;
 }
private:
 void generate(int i, std::vector<int>& nums, std::vector<std::vector<int>>& result,
  std::vector<int > item)
 {
  if (i >= nums.size())
  {
   return;
  }
  item.push_back(nums[i]);
  if (find(result.begin(),result.end(),item)==result.end())
  {
   result.push_back(item);
  }
  generate(i + 1, nums, result, item);
  item.pop_back();
  generate(i + 1, nums, result, item);
 }
};
int main()
{
 std::vector<int> nums;
 nums.push_back(2);
 nums.push_back(1);
 nums.push_back(2);
 nums.push_back(2);
 std::vector<std::vector<int>> result;
 Solution solve;
 result = solve.subsetsWithDup(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][2]
[1][2][2][2]
[2]
[2][2]
[2][2][2]

也可以使用集合判断是否出现过重复集合,代码如下:

#include<vector>
#include<set>
#include<algorithm>
class Solution
{
public:
 Solution() {};
 ~Solution() {};
 std::vector<std::vector<int>> subsetsWithDup(std::vector<int>& nums)
 {
  std::vector<std::vector<int>> result;
  std::vector<int> item;
  std::set<std::vector<int>> res_set;
  std::sort(nums.begin(), nums.end());
  result.push_back(item);
  generate(0,nums,result,item,res_set);
  return result;
 }
private:
 void generate(int i, std::vector<int>& nums, std::vector<std::vector<int>>& result,
  std::vector<int > item, std::set<std::vector<int>>& res_set)
 {
  if (i>=nums.size())
  {
   return;
  }
  item.push_back(nums[i]);
  if (res_set.find(item)==res_set.end())
  {
   result.push_back(item);
   res_set.insert(item);
  }
  generate(i + 1, nums, result, item, res_set);
  item.pop_back();
  generate(i + 1, nums, result, item, res_set);
 }
};
int main()
{
 std::vector<int> nums;
 nums.push_back(2);
 nums.push_back(1);
 nums.push_back(2);
 nums.push_back(2);
 std::vector<std::vector<int>> result;
 Solution solve;
 result = solve.subsetsWithDup(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][2]
[1][2][2][2]
[2]
[2][2]
[2][2][2]

发布了61 篇原创文章 · 获赞 46 · 访问量 1590

猜你喜欢

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