博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode: Subsets 解题报告
阅读量:6506 次
发布时间:2019-06-24

本文共 4086 字,大约阅读时间需要 13 分钟。

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

1 public class Solution { 2     public List
> subsets(int[] S) { 3 List
> ret = new ArrayList
>(); 4 if (S == null) { 5 return ret; 6 } 7 8 Arrays.sort(S); 9 10 dfs(S, 0, new ArrayList
(), ret);11 12 return ret;13 }14 15 public void dfs(int[] S, int index, List
path, List
> ret) {16 ret.add(new ArrayList
(path));17 18 for (int i = index; i < S.length; i++) {19 path.add(S[i]);20 dfs(S, i + 1, path, ret);21 path.remove(path.size() - 1);22 }23 }24 }
View Code

SOLUTION 2:

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

TIME:253 ms.

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

1 // Solution 3: The memory and recursion. 2     public List
> subsets(int[] S) { 3 // 2135 4 List
> ret = new ArrayList
>(); 5 if (S == null) { 6 return ret; 7 } 8 9 Arrays.sort(S);10 return dfs3(S, 0, new HashMap
>>());11 }12 13 public List
> dfs3(int[] S, int index, HashMap
>> map) {14 int len = S.length;15 16 if (map.containsKey(index)) {17 return map.get(index);18 }19 20 List
> ret = new ArrayList
>();21 List
pathTmp = new ArrayList
();22 ret.add(pathTmp);23 24 for (int i = index; i < len; i++) {25 List
> left = dfs3(S, i + 1, map);26 for (List
list: left) {27 pathTmp = new ArrayList
();28 pathTmp.add(S[i]);29 pathTmp.addAll(list);30 ret.add(pathTmp);31 }32 }33 34 map.put(index, ret);35 return ret;36 }

 

SOLUTION 3:

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

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

Ref: 

There are many variations of this problem, I will stay on the general problem of finding all  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 .

 

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}

1 public class Solution { 2     public List
> subsets(int[] S) { 3 List
> ret = new ArrayList
>(); 4 if (S == null || S.length == 0) { 5 return ret; 6 } 7 8 int len = S.length; 9 Arrays.sort(S);10 11 // forget to add (long).12 long numOfSet = (long)Math.pow(2, len);13 14 for (int i = 0; i < numOfSet; i++) {15 // bug 3: should use tmp - i.16 long tmp = i;17 18 ArrayList
list = new ArrayList
();19 while (tmp != 0) {20 // bug 2: use error NumberOfTrailingZeros. 21 int indexOfLast1 = Long.numberOfTrailingZeros(tmp);22 list.add(S[indexOfLast1]);23 24 // clear the bit.25 tmp ^= (1 << indexOfLast1);26 }27 28 ret.add(list);29 }30 31 return ret;32 }33 34 }
View Code

 性能测试:

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:

转载地址:http://nzzfo.baihongyu.com/

你可能感兴趣的文章
Eclipse中绑定java源代码
查看>>
Gena's Code
查看>>
正则式的使用
查看>>
7.Knockout.Js(Mapping插件)
查看>>
jqgride实现每一行的单选
查看>>
CGAL4.10 / CGAL4.13编译
查看>>
机器学习数学基础知识备忘
查看>>
HDFS开发中的一些问题(逐步补充)
查看>>
虚基类&虚继承
查看>>
SRM 670 div2 A B C div1 A(贪心,子问题合并)
查看>>
css 一些常用属性总结
查看>>
泛在电力物联网有项核心技术 你听过没有?
查看>>
构造函数
查看>>
webapi支持跨域访问
查看>>
如何学习FPGA
查看>>
IPS简单使用方法
查看>>
第八次作业
查看>>
[转载] Discrete Mathematics——02 命题逻辑等价与联接词完备
查看>>
核心动画——弹簧动画二
查看>>
db2 基础语法
查看>>