程序员面试金典——9.4集合的子集
程序员面试金典——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集合的子集相关推荐
- 程序员面试金典——3.3集合栈
程序员面试金典--3.3集合栈 Solution1:主要总结下关于vector不太常用的函数 (1)c.pop_back():删除vector对象c中最后一个元素,若c为空,则函数行为未定义.函数返回 ...
- 集合栈 牛客网 程序员面试金典 C++ Python
集合栈 牛客网 程序员面试金典 C++ Python 题目描述 请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈.该数据结构应支持与普通 ...
- 程序员面试金典 - 面试题 17.07. 婴儿名字
题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 每年,政府都会公布一万个最常见的婴 ...
- 程序员面试金典(第 6 版)(简单篇)
程序员面试金典 第6版 简单篇 简单篇 面试题 01.01. 判定字符是否唯一 面试题 01.02. 判定是否互为字符重排 面试题 01.03. URL化 面试题 01.04. 回文排列 面试题 01 ...
- 程序员面试金典1.1
程序员面试金典1.1 重新用java刷一遍,熟悉java语言 文章目录 程序员面试金典1.1 1. 二次遍历 2.哈希表Map 3.利用set的不可重复性 4.用数组 5.位运算 6.用String自 ...
- 程序员面试金典--第k个数
程序员面试金典--第k个数 题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测试样例: 3 返回:7 逐个 ...
- 程序员面试金典 - 面试题 08.13. 堆箱子(DP)
1. 题目 堆箱子.给你一堆n个箱子,箱子宽 wi.深 di.高 hi. 箱子不能翻转,将箱子堆起来时,下面箱子的宽度.高度和深度必须大于上面的箱子. 实现一种方法,搭出最高的一堆箱子.箱堆的高度为每 ...
- 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)
文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...
- 《程序员面试金典》解题目录(更新完毕)
题目来源于LeetCode上的<程序员面试金典>,这里做一个目录方便大家查找.另外有本人的LeetCode解题目录.<剑指Offer>解题目录.LintCode代码能力测试CA ...
最新文章
- 在做项目中遇到的JS问题
- Java注解初体验(简单ORM映射框架)
- 北大校友马里千:计算机视觉商用的下一个十年,AI 生成应占有一席之地
- C# 继承实现父类方法、重写、重载
- c语言计算器实现简单的四则运算.(加,减,乘,除)实验报告,C语言数据结构“简单计算器。”1、简单计算器。请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程...
- 操作系统的进程调度简析
- python中dict的fromkeys用法教程
- 化零为整WCF(14) - 事务(Transaction)
- mysql集群重启offline_mysql集群搭建问题及解决方法集锦
- js 值太大自动转换bignumber
- JMeter中使用“用户自定义变量”实现参数化
- 企业Linux安全机制遭遇信任危机 SELinux成骇客帮凶?
- 2019年开发者必读!20位阿里技术大牛们帮你列了一份经典书单!...
- linux麒麟 ftp,麒麟 vsftp 搭建
- 电子元件-555时基芯片
- 人类能看懂的衍射光学(含基尔霍夫衍射,瑞利--索末菲衍射,夫琅禾费衍射,角谱衍射,菲涅尔衍射积分,菲涅尔衍射的S-FFT算法,T-FFT算法,D-FFT算法)
- 基于Java swing+mysql+eclipse的【水电费管理系统】
- Python遍历文件夹下所有文件及目录
- 4针串口线接法图_​RS232串口线常见接法与引脚定义
- 方差分析、T检验、卡方分析|LSD检验可用于方差同质性检验|LSD检验法与t检验相比的优点
热门文章
- C+++之insert()
- CV学习笔记-数字图像概述
- [冲啊!!!!!]小白SLAM相关基础知识
- php7 断言,PHP7.2常用新特性和函数
- OSG仿真案例(9)——JY61陀螺仪控制飞机姿态
- bootice.exe linux 启动盘,怎么用bootice自己手动制作U盘启动-支持BIOS+UEFI
- centos7安装rabbitmq_rabbitmq v3.7.16安装部署文档
- 可以作为html5页面开发工具的有,HTML5开发工具有哪些
- python的前端和后端_前端与后端的数据交互(jquery ajax+python flask)
- java读取文件到字符串_Java读取文件到字符串