leadcode的Hot100系列--78. 子集--位运算
看一个数组的子集有多少,其实就是排列组合,
比如:[0,1] 对应的子集有:[] [0] [1] [1,1] 这四种。
一般对应有两种方法:位运算 和 回溯。
这里先使用位运算来做。
位运算
一个长度为n的数组,对其做排列组合,可以理解为:这n个数字中,有哪些是存在的,哪些是不存在的。
例如,数组为[1,2,3],可以组合为:[1,2],则说明1和2是存在的,3是不存在的,
我们可以这么规定一下: 用1标记为存在,0标记为不存在,
那么[1,2]这个组合就可以用 110来标记,[1,3]的组合就可以用101来标记,[]的组合就可以用000来标记。
(注:这里为方便理解,将数组直观的位置与标记一一对应,而不考虑数组下标,
实际代码中,是用下标来做对应的)
这样的话:
数组的排列组合问题,就转换为每个数字的存在或者不存在的问题。
这里有三个数字,每个数字都会有存在和不存在的两种情况,总共就会有8种排列,分别是:
000,001, 010, 011, 100, 101, 110, 111
对应的数组分别是:
[],[3],[2], [2,3], [1], [1,3], [1,2], [1,2,3]
重点来了:如果把上面的01标记看成二进制数字的,那对应的十进制数字就是0,1,2,3,4,5,6,7。
这里先统称这些数字为flag(用来标记对应位置的数字是否存在)。
所以,当我已经知道总共的组合有n种的时候,那么就会有 0 到 (n-1) 个 flag 来标记对应位置的数字是否存在。
那么代码中是怎么对应的呢?这次用数组[6,7,8]来举例。
数字6,7,8对应的下标分别是 0,1,2,对应的位置就是 (1 << 下标),
那么:6对应的是flag中的第1位(1<<0),7对应的是flag中的2位(1<<1),8对应的是flag中的第3位(1<<2)。
所以,实际代码中 当flag = 1 (二进制位001)的时候,对应的组合是 [6],flag = 3(二进制位011)的时候,对应的组合是[6,7]。
ps:因为题目要求输出的形式是:[[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]],
这个的话,感觉用c不太好实现,所以就偷偷用了python来实现了,但原理还是一样的!
class Solution(object):
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
subList = []
length = len(nums)
totalCount = pow(2, length) # 得到子集的总个数
for flag in range(totalCount): # 遍历各个flag标记
sub = []
for xiabiao in range(length): # 遍历数组下标,查看对应位置的数字是否存在
if flag & (1<<xiabiao):
sub.append(nums[xiabiao]) # 如果对应的数字存在,就把该数字放入新数组中
subList.append(sub)
return subLis
递归放在下一篇讲解。
leadcode的Hot100系列--78. 子集--位运算的更多相关文章
- leadcode的Hot100系列--78. 子集--回溯
上一篇说了使用位运算来进行子集输出,这里使用回溯的方法来进行排序. 回溯的思想,我的理解就是: 把解的所有情况转换为树或者图,然后用深度优先的原则来对所有的情况进行遍历解析. 当然,因为问题中会包涵这 ...
- [LeetCode]78. 子集(位运算;回溯法待做)
题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], ...
- leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用
提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ...
- leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划
如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ...
- 78 leetCode 位运算解法
按照自己的理解题目,数组内所有的组合:假如[1,2,3,4]看成1111到0000里面的排列组合,取位运算. vector<vector > subsets(vector&nums ...
- leadcode的Hot100系列--62. 不同路径--简单的动态规划
题目比较清晰,简单来说就是: A B C D E F G H I J K L 只能往右或者往下,从A到L,能有几种走法. 这里使用动态规划的方法来做一下. 动态规划最重要的就是动态方程,这里简单说下这 ...
- leadcode的Hot100系列--155. 最小栈
栈:先入后出,后入先出 像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口, 所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来. push,对应入电梯,把数据往里面压 po ...
- leadcode的Hot100系列--206. 反转链表
这里使用两种方式, 一个是直接从头往后遍历 -------> 迭代 一个是从最后一个往前遍历 -----> 递归 迭代 定义三个变量:pPre pNext pNow pPre表示当前节点的 ...
- leadcode的Hot100系列--104. 二叉树的最大深度
依然使用递归思想. 思路: 1.树的深度 = max (左子树深度,右子树深度)+ 1 . ------> 这里的加1是表示自己节点深度为1. 2.如果当前节点为null,则说明它的左右子树深度 ...
随机推荐
- Nucleus PLUS系统架构和组件
(一个)方法论和软件组件 1.软件组件(Software Component)定义 从一般意义上来说.组件(Component)是系统中能够明白辨识的组成部分,一个不透明的功能实现体.软件开发中,组件 ...
- Qt打开外部程序和文件夹需要注意的细节(注意QProcess的空格问题,以及打开本地文件时,需要QUrl::fromLocalFile才可以)
下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...
- Sequence Models and Long-Short Term Memory Networks
LSTM’s in Pytorch Example: An LSTM for Part-of-Speech Tagging Exercise: Augmenting the LSTM part-of- ...
- 活锁(livelock) 专题
活锁(livelock) 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败. 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于 ...
- C# DataGridView合计行
在网上搜了很多关于DataGridView合计行的设计及源码,都不是很合我心意.于是自己写了一个关于合计行的DLL.以后每次要用到合计行的时候只要引用这个DLL就可以了. 效果图如下: 引用Dll: ...
- 零元学Expression Blend 4 - Chapter 18 用实例了解互动控制项「CheckBox」II
原文:零元学Expression Blend 4 - Chapter 18 用实例了解互动控制项「CheckBox」II 延续上一章的CheckBox教学,本章将以实作继续延伸更灵活的运用CheckB ...
- Hadoop分布式文件系统
在一个经典的数据架构中,Hadoop是处理复杂数据流的核心.数据从各种系统中收集而来,并汇总导入到Hadoop分布式文件系统HDFS中,然后通过MapReduce或者其它基于MapReduce封装的语 ...
- 前端工程师应该都了解的16个最受欢迎的CSS框架
摘要: 今天给大家分享16个最受欢迎的CSS框架.这些是根据笔者的爱好以及相关查阅规整出来的.可能还有一些更棒的或者您更喜欢的没有列举出来.如果有,欢迎留言! Pure : CSS Framework ...
- 判断本地系统目录下是否存在XML文件,如果不存在就创建一个XMl文件,若存在就在里面执行添加数据
这是我为项目中写的一个测试的例子, 假如,您需要这样一个xml文件, <?xml version="1.0" encoding="utf-8"?> ...
- SYN591-A型 计数器
SYN591-A型 计数器 秒表计数器累计计数器电机测速表使用说明视频链接: http://www.syn029.com/h-pd-248-0_310_44_-1.html 请将此链接复制到浏览 ...