您的位置:首页 > 其它

Subsets II

2016-05-19 16:26 309 查看
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],

[]
]

思路:

方法一:之前有剔除重复元素的方法,可以先将整个结果求出来,在剔除最后res中的重复的元素

class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>>res;
vector<int>slo;
res.push_back(slo);
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
int len=res.size();
for(int j=0;j<len;j++)
{
slo=res[j];
slo.push_back(nums[i]);
res.push_back(slo);
}
}
sort(res.begin(),res.end());
int index=1;
for(int i=1;i<res.size();i++)
{
if(res[i]!=res[i-1])
res[index++]=res[i];
}
res.resize(index);
return res;
}
};有两次排序的过程,平台显示耗费事件20ms
方法二:可以采用回溯的方法。在进行元素添加到slo的时候需要先判断下这个元素之前有没有出现,出现的话就不添加到结果中,这样可以避免重复。

class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>>res;
vector<int>slo;
res.push_back(slo);
if(nums.empty())
return res;
sort(nums.begin(),nums.end());
DFS(nums,0,slo,res);
return res;
}

void DFS(vector<int>&nums,int index,vector<int>&slo,vector<vector<int>>&res)
{
for(int i=index;i<nums.size();i++)
{
if(i>index&&nums[i]==nums[i-1]) continue;
slo.push_back(nums[i]);
res.push_back(slo);
DFS(nums,i+1,slo,res);
slo.pop_back();
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: