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

类似leetcode:Subsets

解法:

解决这个问题之前,我们先要对时间和空间复杂度有个合理的评估。一个集合会有多少子集?我们可以这么计算,生成了一个子集时,每个元素都可以“选择”在或者不在这个子集中。也就是说,第一个元素有两个选择:它要么在集合中,要么不在集合中。同样,第二个元素也有两个选择,以此类推,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<iostream>
#include<vector>
using namespace std; vector<vector<int> > subset(vector<int> &S)
{
vector<vector<int> > ret;
if(S.empty())
return ret;
int n=S.size();
int i,j;
ret.push_back(vector<int>());
for(i=;i<n;i++)
{
int m=ret.size();
for(j=;j<m;j++)
{
vector<int> tmp=ret[j];
tmp.push_back(S[i]);
ret.push_back(tmp);
}
}
return ret;
} int main()
{
vector<int> res={,,};
vector<vector<int> > ret=subset(res);
for(auto a:ret)
{
for(auto t:a)
cout<<t<<" ";
cout<<endl;
}
cout<<"subset sum : "<<ret.size()<<endl;
}

解法二 :组合数学

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

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

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

careercup-递归和动态规划 9.4的更多相关文章

  1. 70. Climbing Stairs【leetcode】递归,动态规划,java,算法

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  2. 算法 递归 迭代 动态规划 斐波那契数列 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  4. 面试题目——《CC150》递归与动态规划

    面试题9.1:有个小孩正在上楼梯,楼梯有n个台阶,小孩一次可以上1阶.2阶或者3阶.实现一个方法,计算小孩有多少种上楼梯的方式. 思路:第4个数是前三个数之和 注意:能不能使用递归,能不能建立一个很大 ...

  5. python---通过递归和动态规划策略解决找零钱问题

    也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if ch ...

  6. Idea 02.暴力递归与动态规划(1)

    1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记 ...

  7. scramble-string——两个字符串经过树化并旋转后是否一致、递归、动态规划

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  8. OptimalSolution(1)--递归和动态规划(1)斐波那契系列问题的递归和动态规划

    一.斐波那契数列 斐波那契数列就是:当n=0时,F(n)=0:当n=1时,F(n)=1:当n>1时,F(n) = F(n-1)+F(n-2). 根据斐波那契数列的定义,斐波那契数列为(从n=1开 ...

  9. 递归,动态规划,找最短路径,Help Jimmy

    题目链接:http://poj.org/problem?id=1661 解题报告: 1.老鼠每次来到一块木板上都只有两条路可以走,可以使用递归 #include <stdio.h> #in ...

  10. 《Cracking the Coding Interview》——第9章:递归和动态规划——题目10

    2014-03-20 04:15 题目:你有n个盒子,用这n个盒子堆成一个塔,要求下面的盒子必须在长宽高上都严格大于上面的.如果你不能旋转盒子变换长宽高,这座塔最高能堆多高? 解法:首先将n个盒子按照 ...

随机推荐

  1. 【HDOJ】2155 小黑的镇魂曲

    线段树+SPFA最短路可以过.或者DP也能过.需要注意的是xl的范围是错的,测试用例中xl可能为0,他妈的,因为这个一直莫名其妙的wa.1. spfa建图增加一倍的点即可(讨论左端点和右端点). /* ...

  2. IBM Rational-完整的软件工程解决方案工具集

    IBM,即国际商业机器公司,1911年创立于美国,是全球最大的信息技术和业务解决方案公司,其业务遍及全球170多个国家和地区.IBM软件分为五个部分,其中Rational系列是专门针对软件工程的软件工 ...

  3. OpenSSH ‘mm_newkeys_from_blob’函数权限许可和访问控制漏洞

    漏洞名称: OpenSSH ‘mm_newkeys_from_blob’函数权限许可和访问控制漏洞 CNNVD编号: CNNVD-201311-117 发布时间: 2013-11-12 更新时间: 2 ...

  4. [King.yue]Grid列赋值文本,隐藏Value

    例:public string InputFormat 加扩展属性:public string InputFormatText 构造函数中根据Key取到Value的值: var data = Data ...

  5. [NOIP2003]栈

    2003年普及组 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重 ...

  6. vs2010常见错误

    安装vs2013以后,链接数据库总是报内存损坏,无法写入的错误 安装vs2013以后,链接数据库总是报内存损坏,无法写入的错误 用VS2012调试时发现在调用数据集时提示“尝试读取或写入受保护的内存. ...

  7. 微软Azure 存储管理器的简单介绍

    Windows Azure存储用户经常希望能够在“管理器”中查看他们的数据,管理器指的是一款可用于显示存储帐户数据的工具.我们之前提供了我们所知的存储管理器列表.在本文中,我们将对此列表进行更新,使其 ...

  8. sap判断条件

    EQ  等于=  等于NE  不 等于<>  不 等于><  不 等于LT  小 于<  小于LE  小 于等于<=  小 于等于GT  大 于>  大于GE ...

  9. 【解决】HDFS HA无法自动切换问题

    [解决]HDFS HA无法自动切换问题 原因: 最早设置为root互相登录,可是zkfc服务是hdfs账号运行的,没有权限访问到root的id_rsa文件.更改为hdfs账号免密钥登录恢复正常.   ...

  10. 删除旧Ambari集群

    年少无知,安装了1.2.0版本.开源社区动力太强,更新的吼吼的跟不上啊,升级发生错误,于是就想重装了.在网上找到了一个很好的删除脚本,分享一下.原文链接 http://www.cnblogs.com/ ...