[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 ...
随机推荐
- HTML基础-02
<header>网页头部 <hgroup>一个标题组 <main>网页主体 <article> ...
- 数据库之Oracle优化技巧(二)
1.通过内部函数提高 SQL 效率 复杂的 SQL 往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际 工作中是非常有意义的 . 2.使用表的别名(Alias) 当在 SQL 语句中连接 ...
- IDEA中列编辑
快捷键 :Alt+Shift+insert,也可以按住Alt+Shift时,点击要编辑部分
- Jmeter 常用函数(28)- 详解 __FileToString
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 读取整个文件 语法格式 ${__Fil ...
- C++ Templates (1.5 重载函数模板 Overloading Function Templates)
返回完整目录 目录 1.5 重载函数模板 Overloading Function Templates 1.5 重载函数模板 Overloading Function Templates 和普通函数一 ...
- nova 通过 python curl 创建虚拟机---keystone v2
#! /bin/python #coding=utf- import urllib2 import json import requests # token post_url = 'http://12 ...
- 仿京东BOE官网 css代码
* { margin: 0; padding: 0; border: 0; list-style: none; } .box { width: 1518px; height: 1300px; marg ...
- Training spiking neural networks for reinforcement learning
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 原文链接:https://arxiv.org/pdf/2005.05941.pdf Contents: Abstract Introduc ...
- Java数据结构——二叉搜索树
定义二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若 ...
- 从零开始的SpringBoot项目 ( 六 ) 整合 MybatisPlus 实现代码自动生成
1.添加依赖 <!-- MySQL数据库 --> <dependency> <groupId>mysql</groupId> <artifactI ...