LeetCode_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,
If S = [1,2,2], a solution is:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]
class Solution {
public:   
        void subsetsWithoutDup(vector<vector<int> > &ans, vector<int> &s)
        {
            vector<int> empty;
        	ans.push_back(empty);
        	int size = s.size();
        	if (size == 0)
        	{
        		return;
        	}
        	for (int i = 0; i < size; ++i)
        	{
        		int num = s[i];
        		int len = ans.size();
        		for (int j = 0; j < len; ++j)
        		{
        			vector<int> tmp = ans[j];
        			tmp.push_back(num);
        			ans.push_back(tmp);
        		}
        	}
        }
        
        vector<vector<int> > subsetsWithDup(vector<int> &s) 
        {
            vector<vector<int> > ans;
            if (s.size() == NULL)
            {
                return ans;
            }
            sort(s.begin(), s.end());
            int size = s.size();
            vector<int> dup;
            int last = s[0];
            int count = 1;
        	int i = 1;
            for (; i < size; ++i)
            {
                if (s[i] == last)
                {
                    ++count;
                    --size;
                    --i;
                    s.erase(s.begin() + i);                
                }
                else
                {
                    if (count > 1)
                    {
                        dup.push_back(last);
                        dup.push_back(count);
        				--i;
                        s.erase(s.begin() + i);
                        --size;
                    }
                    last = s[i];
                    count = 1;
                }
            }
        	if (count > 1)
        	{
        		dup.push_back(last);
                dup.push_back(count);
        		--i;
                s.erase(s.begin() + i);
                --size;
        	}
        	subsetsWithoutDup(ans, s);
        	int num = 0;
        	int total = dup.size();
        	while (num < total)
        	{
        		int size = ans.size();
        		int nNum = dup[num];
        		int nCount = dup[num + 1];
        		num += 2;
        		for (int i = 0; i < nCount; ++i)
        		{
        			int start = ans.size() - size;
        			int end = ans.size();
        			for (int j = start; j < end; ++j)
        			{
        				vector<int> tmp = ans[j];
        				tmp.push_back(nNum);
        				ans.push_back(tmp);
        			}
        		}
        	}
        	int ansNum = ans.size();
        	for (int i = 0; i < ansNum; ++i)
        	{
        		sort(ans[i].begin(), ans[i].end());
        	}
        	return ans;
        }
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值