原题地址

跟Subsets(参见这篇文章)类似。

但因为有重复元素,所以要考虑去重问题。

什么情况下会出现重复呢?比如S = {5, 5, 5},如果要选1个5,一共有C(3,1)=3种选法,即100, 010, 001,这三种情况在集合的角度看是重复的情况。如果要选2个5,共有C(3,2)=3种选法,即011, 101, 110,这三种情况在集合的角度上看也是重复的。

本质在于,如果要在重复出现的数字当中选择若干个,则只能保留一种取法,其他的都是重复。即,这些重复数字对应的二进制位当中,只能保留一个指定若干位为1的数字。前面的例子中,如果要在S种取2个5,则011, 101, 110这三个数字(二进制为都有2个位为1)只能保留一个。保留哪个呢?随便,不过为了方便编码实现,可以保留1都在左边的数字。上面的例子中,保留110。

如果用DFS实现,也是类似的思想,当搜索到某个数字时,如果决定不选了,那么之后同样的数字也都不再选了。(相当于保证1都出现在二进制数字的左边)。

代码(DFS版):

 vector<vector<int> > res;

 void dfs(vector<int> &S, vector<int> ans, int pos) {
if (pos == S.size()) {
res.push_back(ans);
return;
}
ans.push_back(S[pos]);
dfs(S, ans, ++pos);
ans.pop_back();
while (pos < S.size() && S[pos] == S[pos - ])
pos++;
dfs(S, ans, pos);
} vector<vector<int> > subsetsWithDup(vector<int> &S) {
sort(S.begin(), S.end());
dfs(S, vector<int>(), );
return res;
}

最新文章

  1. 一行代码实现java list去重
  2. 多Web服务器之间共享Session的解决方案
  3. [WPF]建立自适应窗口大小布局的WinForm窗口
  4. JAVA设计模式——单例模式
  5. 点击含下拉菜单的列表/表单按钮:通过JS创建虚拟按钮并点击
  6. CentOS配置vsftpd遇到550错误的解决办法
  7. C# WinForm获取程序所在路径方法
  8. 集合的实现 -- 数据结构与算法的javascript描述 第九章
  9. HTML 颜色值
  10. windows7 64bit下mvn命令后提示‘cmd’不是内部或外部命令,也不是可执行程序或批处理文件
  11. CCF系列之画图(201409-2)
  12. Centos7安装官方JDK
  13. 自学Zabbix8.1 Regular expressions 正则表达式
  14. redis-3.2.7安装脚本
  15. js-ES6学习笔记-数值的扩展
  16. [VS]VS2010如何使用Visual Studio Online在线服务管理团队资源(在线TFS)
  17. MAC安装最新datagrip之后无法非官方激活,而且启动过慢
  18. Rquest对象代码练习
  19. day15(mysql 的多表查询,事务)
  20. Mac配置PHP+Nginx+MySQL开发环境

热门文章

  1. text-rendering 详解
  2. 电商、商城类APP常用标签&quot;hot&quot;--第三方开源--LabelView
  3. Eclipse之Failed to load the JNI shared library&rdquo;&hellip;&hellip;\jvm.dll&rdquo;的解决方案
  4. ASP.NET MVC4学习笔记之Controller的激活
  5. delphi XE7 中的消息
  6. Vmware下Ubuntu无法上网的问题
  7. Oracle 直方图理论
  8. desin pattern
  9. js的reduce方法,改变头等函数
  10. oracle分区表(整理)