程序员面试金典——9.4集合的子集

Solution1:我的答案
该思路本质上是递归,递归的迭代式写法。之前做过类似的题,这个思路就挺好!

class Subset {
public:vector<vector<int> > getSubsets(vector<int> A, int n) {// write code heresort(A.begin(), A.end()); //将A中元素从小到大排列vector<vector<int> > res;if(n == 0)return res;vector<int> temp;res.push_back(temp);//temp是空vector,最后返回结果时要去掉for(int i = 0; i < A.size(); i++) {int a = res.size();for(int j = 0; j < a; j++) {vector<int> temp1 = res[j];temp1.push_back(A[i]);res.push_back(temp1);}}reverse(res.begin(), res.end());res.pop_back();for(int i = 0; i < res.size(); i++)reverse(res[i].begin(), res[i].end());return res;}
};

Solution2:
书上还有一种组合数学的思路,感觉也是很棒棒啊!
在构造一个集合时,每个元素有两个选择:在或不在。再有n个元素的集合中,总共有2n2n2^n个子集,非空子集有2n−12n−12^n-1个,那么每一个子集可以视作一个二进制串。
接着,构造所有子集,就相当于构造所有的二进制数。我们可以迭代访问到2n2n2^n的所有数字,再将这些数字的二进制表示转换为集合。小事一桩!
注意一点:n个二进制组成的数从小到大是0,1,2…2n−12n−12^n-1,共2n2n2^n个数,不要想当然,稍微想一想!如(111)2=7,(000)2=0(111)2=7,(000)2=0{(111)}_2=7,(000)_2=0,只要稍微想一想就行!!!

class Subset {
public:vector<vector<int> > getSubsets(vector<int> A, int n) {// write code heresort(A.begin(), A.end()); //将A中元素从小到大排列vector<vector<int> > res;if(n == 0)return res;int max = 1 << n;for(int i = 0; i < max; i++) { //从1到2的n次方vector<int> temp = getVec(A, i);res.push_back(temp);}reverse(res.begin(), res.end());res.pop_back();for(int i = 0; i < res.size(); i++)reverse(res[i].begin(), res[i].end());return res;}vector<int> getVec(vector<int> &A, int x) {int index = 0;vector<int> res;for(int i = x; i > 0; i >>= 1) {if(i & 1 == 1)res.push_back(A[index]);index++;}return res;}
};

程序员面试金典——9.4集合的子集相关推荐

  1. 程序员面试金典——3.3集合栈

    程序员面试金典--3.3集合栈 Solution1:主要总结下关于vector不太常用的函数 (1)c.pop_back():删除vector对象c中最后一个元素,若c为空,则函数行为未定义.函数返回 ...

  2. 集合栈 牛客网 程序员面试金典 C++ Python

    集合栈 牛客网 程序员面试金典 C++ Python 题目描述 请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈.该数据结构应支持与普通 ...

  3. 程序员面试金典 - 面试题 17.07. 婴儿名字

    题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 每年,政府都会公布一万个最常见的婴 ...

  4. 程序员面试金典(第 6 版)(简单篇)

    程序员面试金典 第6版 简单篇 简单篇 面试题 01.01. 判定字符是否唯一 面试题 01.02. 判定是否互为字符重排 面试题 01.03. URL化 面试题 01.04. 回文排列 面试题 01 ...

  5. 程序员面试金典1.1

    程序员面试金典1.1 重新用java刷一遍,熟悉java语言 文章目录 程序员面试金典1.1 1. 二次遍历 2.哈希表Map 3.利用set的不可重复性 4.用数组 5.位运算 6.用String自 ...

  6. 程序员面试金典--第k个数

    程序员面试金典--第k个数 题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测试样例: 3 返回:7 逐个 ...

  7. 程序员面试金典 - 面试题 08.13. 堆箱子(DP)

    1. 题目 堆箱子.给你一堆n个箱子,箱子宽 wi.深 di.高 hi. 箱子不能翻转,将箱子堆起来时,下面箱子的宽度.高度和深度必须大于上面的箱子. 实现一种方法,搭出最高的一堆箱子.箱堆的高度为每 ...

  8. 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...

  9. 《程序员面试金典》解题目录(更新完毕)

    题目来源于LeetCode上的<程序员面试金典>,这里做一个目录方便大家查找.另外有本人的LeetCode解题目录.<剑指Offer>解题目录.LintCode代码能力测试CA ...

最新文章

  1. 在做项目中遇到的JS问题
  2. Java注解初体验(简单ORM映射框架)
  3. 北大校友马里千:计算机视觉商用的下一个十年,AI 生成应占有一席之地
  4. C# 继承实现父类方法、重写、重载
  5. c语言计算器实现简单的四则运算.(加,减,乘,除)实验报告,C语言数据结构“简单计算器。”1、简单计算器。请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程...
  6. 操作系统的进程调度简析
  7. python中dict的fromkeys用法教程
  8. 化零为整WCF(14) - 事务(Transaction)
  9. mysql集群重启offline_mysql集群搭建问题及解决方法集锦
  10. js 值太大自动转换bignumber
  11. JMeter中使用“用户自定义变量”实现参数化
  12. 企业Linux安全机制遭遇信任危机 SELinux成骇客帮凶?
  13. 2019年开发者必读!20位阿里技术大牛们帮你列了一份经典书单!...
  14. linux麒麟 ftp,麒麟 vsftp 搭建
  15. 电子元件-555时基芯片
  16. 人类能看懂的衍射光学(含基尔霍夫衍射,瑞利--索末菲衍射,夫琅禾费衍射,角谱衍射,菲涅尔衍射积分,菲涅尔衍射的S-FFT算法,T-FFT算法,D-FFT算法)
  17. 基于Java swing+mysql+eclipse的【水电费管理系统】
  18. Python遍历文件夹下所有文件及目录
  19. 4针串口线接法图_​RS232串口线常见接法与引脚定义
  20. 方差分析、T检验、卡方分析|LSD检验可用于方差同质性检验|LSD检验法与t检验相比的优点

热门文章

  1. C+++之insert()
  2. CV学习笔记-数字图像概述
  3. [冲啊!!!!!]小白SLAM相关基础知识
  4. php7 断言,PHP7.2常用新特性和函数
  5. OSG仿真案例(9)——JY61陀螺仪控制飞机姿态
  6. bootice.exe linux 启动盘,怎么用bootice自己手动制作U盘启动-支持BIOS+UEFI
  7. centos7安装rabbitmq_rabbitmq v3.7.16安装部署文档
  8. 可以作为html5页面开发工具的有,HTML5开发工具有哪些
  9. python的前端和后端_前端与后端的数据交互(jquery ajax+python flask)
  10. java读取文件到字符串_Java读取文件到字符串