leetcode_90题——Subsets II (递推)

Subsets II

  Total Accepted: 38124 Total Submissions: 138069My Submissions

 

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

 

For example,
If nums = [1,2,2], a solution is:

[

  [2],

  [1],

  [1,2,2],

  [2,2],

  [1,2],

  []

]

 

Hide Tags
  Array Backtracking
 
    这道题是78题的扩展,在这道题中,数字出现了重复的情况,所以需要处理这种情况,我的处理方式是,当出现重复数字时,记录下之前出现了多少次,在之前的那个李
只在那些次数和这个重复次数相同的里面插入新的数字
 
#include<iostream>

#include<vector>

#include<set>

#include<algorithm>

using namespace std;



multiset<int> tem1;



//求下一个的值

vector<vector<int>> to_next(vector<vector<int>>& vec,vector<int>& vec1,int k)

{

	vector<vector<int>> last=vec;

	if(tem1.count(vec1[k])==0)//没有重复数字的情况

	{

		tem1.insert(vec1[k]);

		for(int i=0;i<vec.size();i++)

		{

			vec[i].push_back(vec1[k]);

			sort(vec[i].begin(),vec[i].end());

			last.push_back(vec[i]);

		}

	}

	else//有重复数字的情况

	{

		int L=tem1.count(vec1[k]);//之前这个数字出现了多少次

		for(int i=1;i<vec.size();i++)

		{

			int flag=0;

			for(int j=0;j<vec[i].size();j++)

			{

				if(vec[i][j]==vec1[k])

					flag++;

			}

			if(flag>=L)//只能选那些个数等于之前出现的次数的地方插入

			{

				vec[i].push_back(vec1[k]);

				sort(vec[i].begin(),vec[i].end());

			    last.push_back(vec[i]);

			}

		}

		tem1.insert(vec1[k]);	

	}

	return last;

}

//题目所需函数

vector<vector<int>> subsetsWithDup(vector<int>& nums) {

	vector<vector<int>> last;

	vector<int> t;

	last.push_back(t);

	for(int i=0;i<nums.size();i++)

	{

		last=to_next(last,nums,i);

	}

	return last;

}

int main()

{

	vector<vector<int>> vec;

	vector<int> vec1;

	vec1.push_back(4);

	vec1.push_back(4);

	vec1.push_back(4);

	vec1.push_back(1);

	vec1.push_back(4);

	vec=subsetsWithDup(vec1);

	for(int i=0;i<vec.size();i++)

	{

		for(int j=0;j<vec[i].size();j++)

			cout<<vec[i][j]<<' ';

		cout<<endl;

	}

}

  

你可能感兴趣的:(LeetCode)