题解
代码
- 子集
class Solution:
### 0201 迭代(48 ms,15.1 MB)
def subsets(self, nums: List[int]) -> List[List[int]]:
res = [[]]
for num in nums:
# 上一轮res表示已有的组合
# 列表生成式表示当前num与每一个已有组合进行搭配
# 在加到本轮res中
res += [[num] + sub for sub in res]
return res
### 0201 迭代(40 ms,15 MB)
def subsets(self, nums: List[int]) -> List[List[int]]:
res, n = [], len(nums)
# 从第0个数开始组合完,再从第1个数开始组合完,以此类推
def dfs(i, sub):
res.append(sub)
# 从数i开始
for j in range(i, n):
dfs(j+1, [nums[j]] + sub)
dfs(0, []) # 从第0个数开始
return res
- 子集 II
class Solution:
### 0201 递归 / 回溯(40 ms,15.1 MB)
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
res, n = [], len(nums)
# 首先对数组排序,以便跳过相同值
nums.sort()
def dfs(idx, sub):
res.append(sub)
for j in range(idx, n):
# 若j不是当前的第0个下标,且与前一个数相同,则跳过相同的值
if j > idx and nums[j] == nums[j-1]:
continue
dfs(j + 1, [nums[j]] + sub) # 注意:这里是[nums[j]],而非nums[j]
dfs(0, [])
return res