看一个数组的子集有多少,其实就是排列组合,

比如:[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. 子集--位运算的更多相关文章

  1. leadcode的Hot100系列--78. 子集--回溯

    上一篇说了使用位运算来进行子集输出,这里使用回溯的方法来进行排序. 回溯的思想,我的理解就是: 把解的所有情况转换为树或者图,然后用深度优先的原则来对所有的情况进行遍历解析. 当然,因为问题中会包涵这 ...

  2. [LeetCode]78. 子集(位运算;回溯法待做)

    题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1],   ...

  3. leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用

    提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ...

  4. leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划

    如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ...

  5. 78 leetCode 位运算解法

    按照自己的理解题目,数组内所有的组合:假如[1,2,3,4]看成1111到0000里面的排列组合,取位运算. vector<vector > subsets(vector&nums ...

  6. leadcode的Hot100系列--62. 不同路径--简单的动态规划

    题目比较清晰,简单来说就是: A B C D E F G H I J K L 只能往右或者往下,从A到L,能有几种走法. 这里使用动态规划的方法来做一下. 动态规划最重要的就是动态方程,这里简单说下这 ...

  7. leadcode的Hot100系列--155. 最小栈

    栈:先入后出,后入先出 像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口, 所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来. push,对应入电梯,把数据往里面压 po ...

  8. leadcode的Hot100系列--206. 反转链表

    这里使用两种方式, 一个是直接从头往后遍历 -------> 迭代 一个是从最后一个往前遍历 -----> 递归 迭代 定义三个变量:pPre pNext pNow pPre表示当前节点的 ...

  9. leadcode的Hot100系列--104. 二叉树的最大深度

    依然使用递归思想. 思路: 1.树的深度 = max (左子树深度,右子树深度)+ 1 . ------> 这里的加1是表示自己节点深度为1. 2.如果当前节点为null,则说明它的左右子树深度 ...

随机推荐

  1. ‘3 sigma’rule(68–95–99.7 rule)

    不限标准正太分布,任一正太分布(normal distribution)均可. 围绕均值附近求得的区间概率: (μ−k⋅σ,μ+k⋅σ) Pr(μ−σ≤x≤μ+σ)≈0.6827Pr(μ−2σ≤x≤μ ...

  2. 使用lead分析功能相似的结构9*9乘法口诀功能

    今天兄弟们的帮助,数据库,具有数据如下面的表: no  name 1    a 2    b 3    c 4    d 怎样用一个sql显演示样例如以下结果: ab ac ad bc bd cd 对 ...

  3. js 小野人跟着鼠标移动

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  4. liunx 系统 一键安装

    本文转自:http://hi.baidu.com/iamcyh/item/e777eb81ba90ed5a26ebd9b0 linux VPS环境(MySQL/Apache/PHP/Nginx)一键安 ...

  5. java中==和equels的区别

    起初接触java的时候这个问题还是比较迷茫的,最近上班之余刷博客的时候看了一些大神写的文章,自己也来总结一下,直接贴代码: package string; public class demo1 { p ...

  6. Win8Metro(C#)数字图像处理--2.7图像伪彩色

    原文:Win8Metro(C#)数字图像处理--2.7图像伪彩色  2.7图像伪彩色函数 [函数名称] 图像伪彩色函数PseudoColorProcess(WriteableBitmap src) ...

  7. Android零基础入门第61节:滚动视图ScrollView

    原文:Android零基础入门第61节:滚动视图ScrollView 前面几期学习了ProgressBar系列组件.ViewAnimator系列组件.Picker系列组件和时间日期系列组件,接下来几期 ...

  8. qt---cdb(Microsoft Console Debugger)调试

    支持的调试器 windows系统下主要的调试器: CDB ,只能调试用户程序,只有控制台界面,以命令行形式工作 NTSD, 只能调试用户程序,只有控制台界面,以命令行形式工作 KD,主要用于内核调试, ...

  9. 利用批处理自动创建schtasks系统任务

    通过批处理自动创建schtasks系统任务,把下列代码保存成bat文件,放到要执行的文件的同级目录即可. @echo on set curpath=%cd%c:cd %systemroot%schta ...

  10. 浅谈stylus与sass的对比

    all we konw , 这两个都是css的预编译工具,但虽然都是编译工具,但还是存在差别的,下面来讲讲其中的区别 1.变量 sass定义变量是以这种形式进行定义的$xxx:10;而stylus的定 ...