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,则说明它的左右子树深度 ...
随机推荐
- ShopNC本地生活o2o网站的源代码,没有域名限制
较前某VIP源代码论坛分享了套ShopNC本地生活o2o站点系统.下载过来却发现根本不能用,所以一直没分享出来.今天咱们这边分享的这套ShopNC本地生活o2o站点源代码,无不论什么的限制,直接ins ...
- abp项目 从sql server迁移至mysql
官方资料:https://aspnetboilerplate.com/Pages/Documents/EF-MySql-Integration 实验发现,还差了两步 整理一下,步骤如下: 1.引用My ...
- windows服务的编写,手动安装与卸载
windows服务的编写 1.要添加的引用 using System.ServiceProcess; using System.ServiceModel ; using WcfServiceLibra ...
- jquery获取选中的值和设置单选扭选中
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- C++的中英文字符串表示(string,wstring),使用wcout.imbue(std::locale("chs"));本地化解析编码
在C++中字符串类的string的模板原型是basic_string template <class _Elem, class traits = char_traits<_Elem> ...
- ES6中的Promise详解
Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...
- Win10《芒果TV》更新v3.5.0夏至版:会员尊享蓝光画质,关联本地视频播放
在Win10秋季创意者更新前夕,Win10版<芒果TV>全平台同步更新夏至版v3.5.0,新增会员蓝光画质,关联本地视频播放,进一步提升使用体验. Win10版<芒果TV>V3 ...
- android中优雅实现recyclerview
在慕课网上看了Abner_泥阿布老师不一样的RecyclerView优雅实现复杂列表布局这个视频课程,本人在Ubuntu16.04LTS下使用android studio2.2.3按照老师讲解写的代码 ...
- ARTS 12.31 - 1.4
Algorithm 这是一道需要用动态规划的问题.求字符串的最长回文子序列. 复习了一遍动态规划,重点是要分析出最优解所包含的子问题的最优解,把过程描述为数学公式. 题目https://leetcod ...
- MIPS开发板的“不二”选择——Creator Ci20单板计算机评测(芯片是君正JZ4780 ,也就是MIPS R3000,系统推荐Debian或深度,官网就有,其它语言有FreePascal和Go和Java和Python)
在MIPS架构的CPU上开发软件,当然需要使用MIPS专用的工具链来编译代码.不过一般的LINUX发行版内都有相应的配套工具链供用户使用.Ci20出厂时的LINUX发行版为DEBIAN 7.5,相应的 ...