LeetCode Problem 78-Subsets

子集。给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

思路一

回溯法。

1
2
3
4
5
6
7
8
9
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        def backtrack(tmp=[], start=0):
            rs.append(tmp)
            for i in range(start, len(nums)):
                backtrack(tmp + [nums[i]], i+1)
        rs = []
        backtrack()
        return rs

思路二

通过位操作,遍历 \(2^n\) 个二进制表示的数,值为 1 的位置所对应的元素添加进子集中。

1
2
3
4
5
6
7
8
9
10
11
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        rs = []
        for i in range(2 ** len(nums)):
            tmp, k = [], 0
            while i >> k:
                if i & 1 << k:
                    tmp.append(nums[k])
                k += 1
            rs.append(tmp)
        return rs

相似问题

  1. Subsets II
  2. Generalized Abbreviation
  3. Letter Case Permutation
此时不赞何时赞!