题目
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
链接:https://leetcode.com/problems/subsets/
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note:
- The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路及代码
1. DFS
- 同39,40题
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
sub = [[]]
cur = []
def dfs(start, cur, sub):
for i in range(start, len(nums)):
cur.append(nums[i])
temp = cur.copy()
sub.append(temp)
dfs(i+1, cur, sub)
cur.pop()
dfs(0, cur, sub)
return sub
2. 位运算
- 对于每一个元素selected or not selected
- 1 << i 代表第i位元素
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
cur = []
ans = []
for s in range(1 << len(nums)):
for i in range(len(nums)):
if s & 1 << i:
cur.append(nums[i])
ans.append(cur.copy())
cur = []
return ans
复杂度
DFS: T =
O
(
2
n
)
O(2^n)
O(2n)
位运算:T =
O
(
n
∗
2
n
)
O(n*2^n)
O(n∗2n),一共有2^n个子集,每个子集需要O(n)时间
S = O ( n ) O(n) O(n)