博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
careercup-递归和动态规划 9.4
阅读量:7247 次
发布时间:2019-06-29

本文共 1793 字,大约阅读时间需要 5 分钟。

9.4 编写一个方法,返回某集合的所有子集。

类似leetcode:

解法:

解决这个问题之前,我们先要对时间和空间复杂度有个合理的评估。一个集合会有多少子集?我们可以这么计算,生成了一个子集时,每个元素都可以“选择”在或者不在这个子集中。也就是说,第一个元素有两个选择:它要么在集合中,要么不在集合中。同样,第二个元素也有两个选择,以此类推,2相乘n次等于2^n个子集。因此,在时间和空间复杂度上,我们不可能做得比O(2^n)更好。

解法一:递归

首先将空集合加入,则当前集合为{

{}}

然后将第一个元素加入当前集合的每一个子集中,并将的到的新的子集也加入到当前集合中,则有{

{}{1}}

加入第二个元素时,则有{

{}{1}{2}{1,2}}

加入第三个元素时,则有{

{}{1}{2}{1,2}{3}{1,3}{2,3}{1,2,3}}

 

根据上面的思路,代码实现如下:

#include
#include
using namespace std;vector
> subset(vector
&S){ vector
> ret; if(S.empty()) return ret; int n=S.size(); int i,j; ret.push_back(vector
()); for(i=0;i
tmp=ret[j]; tmp.push_back(S[i]); ret.push_back(tmp); } } return ret;}int main(){ vector
res={ 1,2,3}; vector
> ret=subset(res); for(auto a:ret) { for(auto t:a) cout<
<<" "; cout<

 解法二 :组合数学

回想一下,在构造一个集合时,每个元素有两种选择(1)该元素在这个集合中(“yes”状态),或者(2)该元素不在这个集合中(“no”状态)。这就意味着每个子集都是一串yes和no,比如“yes,yes,no,no,yes,no”。

由此,总共可能会有2^n子集。怎样才能迭代变量所有元素的所有“yes”“no”序列?如果将每个“yes“视作1,每个”no“视作0,那么,每个子集就可以表示为一个二进制串。

#include
#include
using namespace std;vector
> subset(vector
&S){ vector
> ret; if(S.empty()) return ret; int n=S.size(); int i,j; ret.push_back(vector
()); for(i=0;i
tmp=ret[j]; tmp.push_back(S[i]); ret.push_back(tmp); } } return ret;}vector
> subset1(vector
&S){ vector
> res; int n=1<
tmp; int index=0; //对每一个二进制数检查哪些位为0或1,为1的加入到tmp中,为0的不加入 for(j=i;j>0;j>>=1) { if(j&1) { tmp.push_back(S[index]); } index++; } res.push_back(tmp); } return res;}int main(){ vector
res={ 1,2,3}; vector
> ret=subset1(res); for(auto a:ret) { for(auto t:a) cout<
<<" "; cout<

 

转载地址:http://gunbm.baihongyu.com/

你可能感兴趣的文章
代码清单3-10 一个完整的泛型枚举——从0枚举到9
查看>>
myeclipse 编码问题
查看>>
POJ1637 Sightseeing Tour
查看>>
spring数据绑定默认的日期解析格式解析不了yyyy格式
查看>>
poi 下拉框实现
查看>>
百度地图通过地址得到经纬度
查看>>
ubuntu环境部署项目
查看>>
BZOJ 1017 魔兽地图DotR(树形DP)
查看>>
ecshop价格区间导航
查看>>
有时间可研究的题目
查看>>
3Sum
查看>>
vue -- 项目打包优化
查看>>
React实践debug:JSX输出的限制(存疑)
查看>>
Dapper.Rainbow 简单使用
查看>>
web基础
查看>>
Spring 5 新特性:函数式Web框架
查看>>
IoC
查看>>
微软视频学习
查看>>
第三章:垃圾回收器-G1收集器
查看>>
XML 和 List 互转类
查看>>