90. Subsets II

题目描述

Given a collection of integers that might contain duplicates, S, 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,IfS =[1,2,2], a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]

思路

为了保证不重复,我们规定产生的子集内部的元素按照升序。当前前缀+一个不同的元素扩展,由不同的前缀扩展的子集当然是不同的,而由相同前缀扩展来的子集,由于是+一个不同的元素进行的扩展,所以也是不同的,这就保证这种方法不会发生重复,其实,这个问题还可以利用层次遍历(宽度优先遍历),按照子集的长度大小,一圈一圈的长度加1来解决。

代码

class Solution {
public:
    vector<vector<int> > subsetsWithDup(vector<int> &S) {

    	vector<vector<int>> ret;
    	vector<int> pre;
    	ret.push_back(pre);
    	sort(S.begin(),S.end());//排序是为了去重的需要
    	subsetsWithDupCore(S,0,ret,pre);
    	return ret;      
    }

    void subsetsWithDupCore(vector<int> &S,int start,vector<vector<int>> &ret,vector<int> &pre)
    {   

      if(start == S.size())
            return;
	//枚举要扩展的一个元素的不同可能情况
    	for(int i = start;i < S.size();i++)
    	{
    		if(i!=start && S[i] == S[i-1])
    			continue;
    		pre.push_back(S[i]);
    		ret.push_back(pre);
    		subsetsWithDupCore(S,i+1,ret,pre);
    		pre.pop_back();   

    	}
    }
};

posted on 2021-05-03 08:40  朴素贝叶斯  阅读(28)  评论(0编辑  收藏  举报

导航