[LeetCode]78. 子集(位运算;回溯法待做)
题目
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subsets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
方法一 位运算
- 此方法仅限nums的长度为32以下,否则溢出。
- 对于长度为len的数组nums={2,3,4,5},掩码范围[0,2^4),有
2^4==1<<len。 - 对于每个掩码,掩码为1的位的nums元素加入当前所求子集中,
((bitMask >> i) & 1)可以判断掩码的哪些位为1。故每条掩码对应一个子集。
方法二 枚举
- 遍历数组,每次,将当前所有子集都加上当前元素构成新的一些子集,加入当前子集集合中。
方法三 回溯
todo
回溯法待做。
代码
方法一 位运算
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> subSetList = new LinkedList<>();
int len = nums.length;
int subSetCnt = 1 << len;// 子集数目
for (int bitMask = 0; bitMask < subSetCnt; ++bitMask) {
List<Integer> subSet = new LinkedList<>();
for (int i = 0; i < len; ++i) {
if (((bitMask >> i) & 1) == 1) { // 如果掩码第(低)i位为1
subSet.add(nums[i]);
}
}
subSetList.add(subSet);
}
return subSetList;
}
方法二 枚举
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> subSetList = new LinkedList<>();
int len = nums.length;
subSetList.add(new LinkedList<>());
for (int i = 0; i < len; ++i) {
int curSubSetCnt = subSetList.size();
for (int j = 0; j < curSubSetCnt; ++j) { // 注意这里用常数curSubSetCnt,保证只遍历列表未加入这个元素之前的所有子集
List<Integer> newSebSet = new LinkedList<>(subSetList.get(j));
newSebSet.add(nums[i]);
subSetList.add(newSebSet);
}
}
return subSetList;
}
[LeetCode]78. 子集(位运算;回溯法待做)的更多相关文章
- leadcode的Hot100系列--78. 子集--位运算
看一个数组的子集有多少,其实就是排列组合, 比如:[0,1] 对应的子集有:[] [0] [1] [1,1] 这四种. 一般对应有两种方法:位运算 和 回溯. 这里先使用位运算来做. 位运算 一个长度 ...
- LeetCode 78. 子集 C++(位运算和回溯法)
位运算 class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { ...
- C#LeetCode刷题-位运算
位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...
- 每日一题-——LeetCode(78)子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集).输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2, ...
- LeetCode解题中位运算的运用
位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...
- LeetCode编程训练 - 位运算(Bit Manipulation)
位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...
- leetcode 78. 子集 JAVA
题目: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], ...
- UVa 818Cutting Chains (暴力dfs+位运算+二进制法)
题意:有 n 个圆环,其中有一些已经扣在一起了,现在要打开尽量少的环,使所有的环可以组成一条链. 析:刚开始看的时候,确实是不会啊....现在有点思路,但是还是差一点,方法也不够好,最后还是参考了网上 ...
- LeetCode 78. 子集(Subsets) 34
78. 子集 78. Subsets 题目描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: 解集不能包含重复的子集. 每日一算法2019/6/6Day 34L ...
随机推荐
- Es6扩展运算符--三点运算符(...)--展开语法(Spread syntax)
0.看文档呀 关于拓展运算符更详细的解释见 > MDN展开语法 关于剩余参数更详细的解释见 >MDN剩余参数 关于解构赋值更详细的解释见 >MDN解构赋值 直接看上面的文档更好 1. ...
- 设计模式详解及Python实现
设计模式及Python实现 设计模式是什么? Christopher Alexander:"每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心*.这样你就能一次又一 ...
- 【NOI2014】动物园 - KMP
题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法. 某天, ...
- 《Head First 设计模式》:适配器模式
正文 一.定义 适配器模式将一个类的接口(被适配者),转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 要点: 适配器实现了目标接口,并持有被适配者的实例. 适配器使用被适配者的方 ...
- 笔记:Linux用户管理(补充)、权限管理、内存管理、网络管理、渗透常用命令
一.用户管理(补充) 添加用户:useradd [选项] 用户名 useradd -u 5000 -g demogroup -G root -d /home/demo -s /bin/bash dem ...
- selenium定位方法实例
selenium定位方法实例 首先打开浏览器输入微博的网址,将网页最大化,等待3秒 from selenium import webdriver import time driver = webdri ...
- Java 8新特性(三):Optional类
在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题.本篇文章将详细介绍Option ...
- Adaptive Critics and the Basal Ganglia
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! This Article is brought to you for free and open access by the Comput ...
- HTTP基本原理-Network各列标签的含义
第一列 Name:请求的名称,一般会将URL的最后一部分内容当作名称 第二列 Status:响应的状态码,显示为 200,则代表相应是正常的.通过状态码,我们可以判断发送了请求之后是否得到了正常的相应 ...
- Java程序员值得拥有的TreeMap指南
先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个有颜值却假装靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题 ...