Subsets

update Jul 8, 2017 20:57

leetcodearrow-up-right

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

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

Basic Idea:

  1. DFS, 根据决策树的思想,我们可以构建一棵二叉树,每个node代表选择或者不选择某个element,只要照此规则写出recursion即可;

  2. 每层递归中逐位考虑, 例如输入数组 [1,2,3,4], 第一层递归为前缀分别为 [1,2,3,4],对 1 的第二层subtree,考虑 [2,3,4] ...。也可以理解为对结果的第一位,考虑 [1,2,3,4],然后第二位、第三位,以此类推。事实上,能否看透这种解法是逐位考虑非常关键

  3. DP, 对于每个数,我们考虑是否选择它,如果不选择,则结果不变,如果选择,则结果要加上(之前所有结果后面加上当前数)。所以实际上我们只要做:

    res = [[]]
    for num in sorted(nums):
        res += [pre + [num] for pre in res]
    return res
  4. Bit manipulation. 因为长度为length的数组共有(2 ^ length)种subsets,所以我们只要用从 0 至 (2 ^ length - 1)的数作为bitMap,就可以搞定。

DFS 决策树,java code:

逐位考虑,java code:

python 的在上面,非常简短而且巧妙。 java:

DP, java code:

Bit Manipulation, Java Code:

update Jan 7,2017 22:20

Update

新的思路参考 DFS notesarrow-up-right;

其实和之前的决策树的思路非常接近。

Last updated