Subsets

Given a set of distinct integers, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,

If S = [1,2,3], a solution is:

[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

[]

]

SOLUTION 1:

使用九章算法的模板:

递归解决。

1. 先对数组进行排序。

2. 在set中依次取一个数字出来即可,因为我们保持升序,所以不需要取当前Index之前的数字。

TIME: 227 ms

 public class Solution {
public List<List<Integer>> subsets(int[] S) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if (S == null) {
return ret;
} Arrays.sort(S); dfs(S, , new ArrayList<Integer> (), ret); return ret;
} public void dfs(int[] S, int index, List<Integer> path, List<List<Integer>> ret) {
ret.add(new ArrayList<Integer>(path)); for (int i = index; i < S.length; i++) {
path.add(S[i]);
dfs(S, i + , path, ret);
path.remove(path.size() - );
}
}
}

SOLUTION 2:

在Solution 1的基础之上,使用Hashmap来记录中间结果,即是以index开始的所有的组合,希望可以加快运行效率,最后时间:

TIME:253 ms.

实际结果与预期反而不一致。原因可能是每次新组装这些解也需要耗费时间

 // Solution 3: The memory and recursion.
public List<List<Integer>> subsets(int[] S) {
//
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if (S == null) {
return ret;
} Arrays.sort(S);
return dfs3(S, , new HashMap<Integer, List<List<Integer>>>());
} public List<List<Integer>> dfs3(int[] S, int index, HashMap<Integer, List<List<Integer>>> map) {
int len = S.length; if (map.containsKey(index)) {
return map.get(index);
} List<List<Integer>> ret = new ArrayList<List<Integer>>();
List<Integer> pathTmp = new ArrayList<Integer>();
ret.add(pathTmp); for (int i = index; i < len; i++) {
List<List<Integer>> left = dfs3(S, i + , map);
for (List<Integer> list: left) {
pathTmp = new ArrayList<Integer>();
pathTmp.add(S[i]);
pathTmp.addAll(list);
ret.add(pathTmp);
}
} map.put(index, ret);
return ret;
}

SOLUTION 3:

相当牛逼的bit解法。基本的想法是,用bit位来表示这一位的number要不要取,第一位有1,0即取和不取2种可能性。所以只要把0到N种可能

都用bit位表示,再把它转化为数字集合,就可以了。

Ref: http://www.fusu.us/2013/07/the-subsets-problem.html

There are many variations of this problem, I will stay on the general problem of finding all subsets of a set. For example if our set is [1, 2, 3] - we would have 8 (2 to the power of 3) subsets: {[], [1], [2], [3], [1, 2], [1, 3], [1, 2, 3], [2, 3]}. So basically our algorithm can't be faster than O(2^n) since we need to go through all possible combinations.

There's a few ways of doing this. I'll mention two ways here - the recursive way, that we've been taught in high schools; and using a bit string.

Using a bit string involves some bit manipulation but the final code can be found easy to understand. The idea  is that all the numbers from 0 to 2^n are represented by unique bit strings of n bit width that can be translated into a subset. So for example in the above mentioned array we would have 8 numbers from 0 to 7 inclusive that would have a bit representation that is translated using the bit index as the index of the array.

Nr

Bits

Combination

0

000

{}

1

001

{1}

2

010

{2}

3

011

{1, 2}

4

100

{3}

5

101

{1, 3}

6

110

{2, 3}

7

111

{1, 2, 3}

 public class Solution {
public List<List<Integer>> subsets(int[] S) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if (S == null || S.length == ) {
return ret;
} int len = S.length;
Arrays.sort(S); // forget to add (long).
long numOfSet = (long)Math.pow(, len); for (int i = ; i < numOfSet; i++) {
// bug 3: should use tmp - i.
long tmp = i; ArrayList<Integer> list = new ArrayList<Integer>();
while (tmp != ) {
// bug 2: use error NumberOfTrailingZeros.
int indexOfLast1 = Long.numberOfTrailingZeros(tmp);
list.add(S[indexOfLast1]); // clear the bit.
tmp ^= ( << indexOfLast1);
} ret.add(list);
} return ret;
} }

性能测试:

1. when SIZE = 19:

Subset with memory record: 14350.0 millisec.

Subset recursion: 2525.0 millisec.

Subset Iterator: 5207.0 millisec.

表明带memeory的性能反而不行。而iterator的性能也不并不如。

2. size再继续加大时,iterator的会出现Heap 溢出的问题,且速度非常非常慢。原因不是太懂。

GITHUB: https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/dfs/Subsets.java

LeetCode: Subsets 解题报告的更多相关文章

  1. LeetCode: Permutations 解题报告

    Permutations Given a collection of numbers, return all possible permutations. For example,[1,2,3] ha ...

  2. 【LeetCode】78. Subsets 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 回溯法 日期 题目地址:https://leet ...

  3. 【LeetCode】698. Partition to K Equal Sum Subsets 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetco ...

  4. 【LeetCode】916. Word Subsets 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/word-sub ...

  5. leetcode—Palindrome 解题报告

    1.题目描述 Given a string s, partition s such that every substring of the partition is a palindrome. Ret ...

  6. LeetCode C++ 解题报告

    自己做得LeetCode的题解,使用C++语言. 说明:大多数自己做得,部分参考别人的思路,仅供参考; GitHub地址:https://github.com/amazingyyc/The-Solut ...

  7. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  8. LeetCode: Triangle 解题报告

    Triangle Given a triangle, find the minimum path sum from top to bottom. Each step you may move to a ...

  9. LeetCode: isSameTree1 解题报告

    isSameTree1 Given two binary trees, write a function to check if they are equal or not. Two binary t ...

随机推荐

  1. python tkinter-消息框、对话框、文件对话框

    python tkinter-消息框.对话框.文件对话框   消息框 导入 import tkinter import tkinter.messagebox #这个是消息框,对话框的关键 提示消息框 ...

  2. 李宏毅机器学习笔记2:Gradient Descent(附带详细的原理推导过程)

    李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...

  3. CTFlearn Inj3ction Time --sql注入python多线程脚本练习

    0x00前言: 本题是国外的一个CTF平台的题目,题目不难,但学习了波多线程payload写法 先看题目描述,提示"union是个有用的命令",估计是用联合查询就能出答案的(因为前 ...

  4. 事物注解方式: @Transactional

    当标于类前时, 标示类中所有方法都进行事物处理 , 例子: 1 @Transactional public class TestServiceBean implements TestService { ...

  5. 【Android】窗口机制分析与UI管理系统

    类图关系 在看Android的窗口机制之前,先看看其主要的类图关系以及层级之间的依赖与调用关系 1.window在当前的android系统的中的呈现形式是PhoneWindow (frameworks ...

  6. 项目冲刺Third

    Third Sprint PS:经今天讨论,我们小队决定撤掉用GUI设计界面,改用html和php制作,所以需要修改前面的博客及重新分配任务 1.各个成员今日完成的任务 蔡振翼:撰写博客 谢孟轩:借阅 ...

  7. linux 关于时间日期date

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...

  8. 在远程桌面服务中配置RD网关直接访问内网

    原文地址:http://wangchunhai.blog.51cto.com/225186/1139388/ 远程桌面网关(RD 网关)是一项角色服务,使授权远程用户可以从任何连接到 Internet ...

  9. windows server 2008 R2安装图片浏览器/照片查看器方法

    有用户的电脑安装了windows server 2008 R2,浏览大量图片时很不方便,因为系统中没有照片查看器或图片浏览器.其实,win2008 R2是有照片查看器的,只是默认情况下没有开启.参考以 ...

  10. Mentor面向智能家居的IoT方案

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wireless_com/article/details/82111734 眼下有各种智能家居的自己主 ...