首页 > 其他 > 详细

90. Subsets II

时间:2021-07-11 01:04:30      阅读:29      评论:0      收藏:0      [点我收藏+]

题目描述

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();   

    	}
    }
};

90. Subsets II

原文:https://www.cnblogs.com/zjuhaohaoxuexi/p/14995312.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!