day28 回溯算法part4 代码随想录算法训练营 90. 子集 II
题目:90. 子集 II
我的感悟:
- 只要功夫深,铁树也开花
- 参考答案,没我写的好
理解难点:
- 去重
代码难点:
- i-1的含义
易错点:
- nums要排序
- 回溯要写i+1
- path.append要添加的是nums[i]
代码示例:
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
# 难点是如果去重
# 解决方案是: 利用used数组,
# 另一个难点是i-1是什么?既可以是同一个树层上的,也可以是同一个树枝上的
# 利用i-1 =0 说明是回溯过来的,是同一个树层的
# i-1 = 1 说明是同一个树枝的
start_index = 0
path = []
result = []
used = [0] * len(nums)
nums.sort() # 记得要排序
self.backtracking(nums,start_index,path,result,used)
return result
def backtracking(self,nums,start_index,path,result,used):
# 无终止条件,直接收获结果
result.append(path[:])
for i in range(start_index,len(nums)):
# 补充去重的逻辑
if i > 0 and nums[i] == nums[i-1] and used[i-1] == 0:
continue
path.append(nums[i])
used[i] = 1
self.backtracking(nums,i+1,path,result,used)
used[i] = 0
path.pop()
通过截图:
扩展写法:
资料:
大家之前做了 40.组合总和II 和 78.子集 ,本题就是这两道题目的结合,建议自己独立做一做,本题涉及的知识,之前都讲过,没有新内容。
题目链接/文章讲解:https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html