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();
}
}
};
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();
}
}
};
相关文章推荐
- 自定义异常简单实例
- es部署在docker里面,让es固定在一台slave上跑
- linux 权限
- Unity对象的所有组件深拷贝与粘贴
- 团队作业2
- 独立博客收藏
- Unity对象的所有组件深拷贝与粘贴
- 分布式存储 CentOS6.5虚拟机环境搭建FastDFS-5.0.5集群
- 使用内部类
- Qt创建数据库、插入内容
- 技术方案只有能够快速有效的解决业务问题,为公司创造价值,才能够活下去。
- Flask中路由使用解析
- 香港服务器出租托管机柜出租国际带宽云主机免备案
- ping程序
- structs2 S-019漏洞修复
- CP_THREAD_ACP与CP_ACP区别
- pomelo
- web大文件上传控件-监控fd_create流程-Xproer.HttpUploader6
- oracle数据库表,索引创建实例
- Sublime text 的配置