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

视频讲解:https://www.bilibili.com/video/BV1vm4y1F71J

posted @ 2024-02-18 18:54  o蹲蹲o  阅读(6)  评论(0编辑  收藏  举报