跳到主要内容

78. 子集(Medium)

题目描述

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

样例

Input: nums = [1,2,3]
Output:
[
[3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

题目解析

本题是一道模板题,是根据 77. 组合(Medium) 改变而来。

参考:回溯算法:求子集问题!

这篇文章总结的很好:「在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果」

img

Python 代码示例

def backtracking(nums, ans, visited, cur, tmp):
# 记录所有中间节点,即是遍历整课树,没有回退条件
ans.append(tmp[:])
for i in range(cur, len(nums)):
tmp.append(nums[i])
backtracking(nums, ans, visited, i + 1, tmp) # i + 1 保证了不会出现死循环
tmp.pop()

class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
visited = [0] * len(nums)
ans = []
backtracking(nums, ans, visited, 0, [])
return ans

参考资料

  1. 回溯算法:求子集问题!