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.

例子:

If nums = [1,2,2], a solution is:

[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

求子集而已,不过这里的麻烦是子集的数字可能是重复的,这样可能会出现相同的结果的情况,解决的方法是先排序,然后dfs,dfs的时候如果发现当前的数与前一个数相等的话那么跳过进行下一个。这样就不会出现相同的vector的情况,具体代码如下:

 class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
ret.clear();
tmp.clear();
rawVec = nums;
sort(rawVec.begin(), rawVec.end());
dfs();
return ret;
} void dfs(int start)
{
ret.push_back(tmp); //首先push一个空集
for(int i = start; i < rawVec.size(); ++i){
if(i != start && rawVec[i] == rawVec[i - ]) continue; //这里的i != start;应该注意
tmp.push_back(rawVec[i]);
dfs(i + );
tmp.pop_back();
}
}
private:
vector<vector<int>> ret;
vector<int> tmp;
vector<int> rawVec; };

下面是java代码,改成了没有全局变量的形式,比上面的看起来要简单一些,代码如下所示,方法和上面的也有些许的不同:

 public class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ret = new ArrayList<List<Integer>>();
List<Integer> tmp = new ArrayList<Integer>();
dfs(ret, tmp, nums, 0, nums.length);
return ret;
} public void dfs(List<List<Integer>> ret, List<Integer> tmp, int [] nums, int start, int limit){
if(start > limit)
return;
else if(start == limit){
ret.add(new ArrayList<Integer>(tmp));
return;
}else{
ret.add(new ArrayList<Integer>(tmp));
for(int i = start; i < limit; ++i){
tmp.add(nums[i]);
dfs(ret, tmp, nums, i+1, limit);
tmp.remove((Integer)nums[i]);
while(i+1 < limit && nums[i+1] == nums[i]) //跳过所有的重复的数字
i++; //这里加完了之后while循环又会再加一次,正好跳过所有的重复的值
}
}
}
}

最新文章

  1. 07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置
  2. RabbitMQ安装实践
  3. 02 Hibernate错题分析
  4. Drawing Arc Using ArcSegment in XAML
  5. 全局修改Lable/Button字体
  6. UVa 10006 - Carmichael Numbers
  7. python编写telnet登陆出现TypeError:&#39;str&#39; does not support the buffer interface
  8. 快捷键Ctrl+c、Ctrl+d、Ctrl+u、Ctrl+a、Ctrl+e
  9. ARM指令集——条件执行、内存操作指令、跳转指令
  10. JS~JS里的数据类型
  11. 实现AJAX局部刷新以及PageMethod方法的使用
  12. Shell编程中Shift的用法(转)
  13. Android 异步消息处理机制 让你在深入了解 Looper、Handler、Message之间的关系
  14. robotium如何定位控件?
  15. mac 电脑配置cordova
  16. WinSock 异步I/O模型-1
  17. C#高级编程笔记之第三章:对象和类型
  18. 微信小程序1
  19. 映像文件工具srec
  20. 剖析插件 DataTable 自定义列表列get请求如何书写传递的参数

热门文章

  1. springboot 2.0 配置 logback
  2. F110 BADI增强
  3. C#数组存入引用类型
  4. chrome浏览器插件让你浏览github的时候像IDE一样提供项目目录
  5. 约瑟夫环的C语言数组实现
  6. Python编程-多线程
  7. Java zip 压缩 文件夹删除,移动,重命名,复制
  8. Linux的压缩命令(tar,gzip,zip)
  9. INSPIRED启示录 读书笔记 - 第31章 苹果公司给我的启示
  10. mongodb 中 Aggregation 的管道和分片集合( Pipeline and Sharded Collections)