题目

给定一组不含重复元素的整数数组 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. 子集(位运算;回溯法待做)的更多相关文章

  1. leadcode的Hot100系列--78. 子集--位运算

    看一个数组的子集有多少,其实就是排列组合, 比如:[0,1] 对应的子集有:[] [0] [1] [1,1] 这四种. 一般对应有两种方法:位运算 和 回溯. 这里先使用位运算来做. 位运算 一个长度 ...

  2. LeetCode 78. 子集 C++(位运算和回溯法)

    位运算 class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { ...

  3. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集   67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...

  4. 每日一题-——LeetCode(78)子集

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

  5. LeetCode解题中位运算的运用

    位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...

  6. LeetCode编程训练 - 位运算(Bit Manipulation)

    位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...

  7. leetcode 78. 子集 JAVA

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

  8. UVa 818Cutting Chains (暴力dfs+位运算+二进制法)

    题意:有 n 个圆环,其中有一些已经扣在一起了,现在要打开尽量少的环,使所有的环可以组成一条链. 析:刚开始看的时候,确实是不会啊....现在有点思路,但是还是差一点,方法也不够好,最后还是参考了网上 ...

  9. LeetCode 78. 子集(Subsets) 34

    78. 子集 78. Subsets 题目描述 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明: 解集不能包含重复的子集. 每日一算法2019/6/6Day 34L ...

随机推荐

  1. 关于 JavaScript 字符串的一个小知识

    说起字符串,我们再熟悉不过了.接触编程的第一个经典任务就是输出字符串:Hello, world.但是你知道 JavaScript 字符串在计算机里是怎么表示的吗? 最简单直观但不太准确的的理解就是,字 ...

  2. 冒泡排序(Bubble Sorting)

    基本介绍 时间复杂度O(n^2) 冒泡排序(Bubble Sorting)的基本思想是:通过对待 排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大 的元素逐 ...

  3. windows操作报错:无法启动此程序,因为计算机中丢失api-ms-win-core-winrt-string-l1-1-0.dll

    在Windows上做提交svn操作时报错:无法启动此程序,因为计算机中丢失api-ms-win-core-winrt-string-l1-1-0.dll,如下图: 解决办法: 在 https://cn ...

  4. IA-32/centos7开机流程

    开机后系统首先在实地址模式下工作(只有1MB的寻址空间) 开机过程中,需要先准备在实模式下的中断向量表和中断服务程序.通常,由固化在主板上一块ROM芯片中的BIOS程序完成 加载BIOS的硬件信息,B ...

  5. 个人项目(WordCount C语言)

    WordCount程序(C语言) Github地址:https://github.com/peter-ye-code/WordCount 一.题目描述 实现一个简单而完整的软件工具(源程序特征统计程序 ...

  6. 方差分析、T检验、卡方分析如何区分?

    差异研究的目的在于比较两组数据或多组数据之间的差异,通常包括以下几类分析方法,分别是方差分析.T检验和卡方检验. 三个方法的区别 其实核心的区别在于:数据类型不一样.如果是定类和定类,此时应该使用卡方 ...

  7. Nuxt.js 踩坑记录(2) 使用sequelize时,提示install mysql2,安装了仍然不能解决问题

    打算写一个nuxt.js+sequelize+mysql的个人博客,遇到了挺多坑,还是坚持了下来,终于解决了这个bug. 今天不知道我做了什么,页面就报错了,定位到了使用sequelize的JS文件里 ...

  8. springboot-swagger配置

    原文地址 https://www.cnblogs.com/softidea/p/6251249.html https://www.cnblogs.com/xiebq/p/9181517.html 1p ...

  9. Linux下如何知道是否有人在使坏?

    在 Linux 下查看用户的行为,不仅仅是网管要做的事,也是开发人员所应该具备的基本技能之一.为什么呢?因为有时其他同事在做一些很消耗资源的事情,比如在编译大型程序,可能会导致服务器变得很慢,从而影响 ...

  10. 一个神奇的jq插件----zTree

    最近在公司做项目中用到了一个树(ztree)的插件,使用起来非常顺手,便写下这篇博客,用来记录一下,以便后续使用 首先先放上ztree官方的地址:http://www.treejs.cn/v3/mai ...