首页 > 编程语言 >day28 回溯算法part4 代码随想录算法训练营 90. 子集 II

day28 回溯算法part4 代码随想录算法训练营 90. 子集 II

时间:2024-02-18 19:00:42浏览次数:30  
标签:index used day28 nums 随想录 start 算法 result path

题目: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

标签:index,used,day28,nums,随想录,start,算法,result,path
From: https://www.cnblogs.com/liqi175/p/18019822

相关文章

  • 代码随想录算法训练营第二十天 | 236. 二叉树的最近公共祖先 , 501.二叉搜索树中的众
      530.二叉搜索树的最小绝对差 已解答简单 相关标签相关企业 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。 示例1:输入:root=[4,2,6,1,3]输出:1示......
  • 数据结构 —— 串 KMP算法
    串很有意思,就是我们认知的String 1.蛮力算法,就是子串一个一个字符对比。 2.KMP算法时间复杂度O(m+n)关键问题在于构造,Next数组。但是,理解到KMP算法的前后缀重叠,还是比较快的。基本思想是,如果目前的字母不匹配,我往前挪动几个字母,可以匹配到一致的?然后把这个距离记下......
  • 2024牛客寒假算法基础集训营2
    C.TokitsukazeandMin-MaxXOR题解:01Trie观察后发现对序列\(a\)排序并不影响结果然后容易知道,对于\(i<j,a_i\oplusa_j\leqk\),一共有\(2^{i-j-1}\)种序列\(b\)满足条件,特别的,如果\(i=j\),只有\(1\)种满足条件那么现在问题就转换为,我们固定\(a_......
  • 代码随想录算法训练营第十九天 | 98.验证二叉搜索树, 700.二叉搜索树中的搜索,617.合并
     654.最大二叉树 已解答中等 相关标签相关企业 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树......
  • 代码随想录算法训练营第十八天 | 112. 路径总和,113. 路径总和ii ,106.从中序与后序遍
     513.找树左下角的值 已解答中等 相关标签相关企业 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层最左边 节点的值。假设二叉树中至少有一个节点。 示例1:输入:root=[2,1,3]输出:1示例2:输入:[1,2,3,4,null,5,6,n......
  • 算法题记录
    试写一个python程序,求平面直角坐标系中两点的距离:classCoordinate:def__init__(self,x,y):self.x=xself.y=ydefdistance(self,other):x_diff_sq=(self.x-other.x)**2print(x_diff_sq)y_diff_sq=(self.y-other.y)**2......
  • 【算法】007_前缀树和贪心算法
    1.前缀树一个字符串类型的数组arr1,另一个字符串类型的数组arr2.arr2中有哪些字符,是arr1中出现的?arr2中有哪些字符是作为arr1中某个字符串前缀出现的?arr2中有哪些字符是作为arr1中某个字符串前缀出现的?pass:表示当前这个结点被经过的次数end:这个结点作为结尾的次数例如......
  • 路由选择算法简要介绍
    本文仅对LS和DV进行简单的介绍,由于作者初学计算机网络,同时也没有学习图论的知识,若有不妥之处还请指出.一、链路状态算法(LS)特殊量:D(v):直到本次迭代,从源节点到节点v的最低路径开销p(v):从源到v沿着当前最低开销路径的前一节点N':已确定最短路径的节点集c(a,b):两......
  • day28 回溯算法part4 代码随想录算法训练营 78. 子集
    题目:78.子集我的感悟:看见弹幕是秒了,我有点不敢相信,自己试了试,没有通过,再看了一眼文字讲解。感觉懂了点理解难点:这题可以没有终止条件,开始我就疑惑这个终止条件怎么写注意这个nums[i]要添加进入是可以不写终止的,不会出现无线递归的,因为是从i+1开始,那会不会越界??,不会,最......
  • 今天练习2-回溯算法-93. 复原 IP 地址
    注意点&感悟:加油!题目链接:93.复原IP地址自己独立写的代码:classSolution:defrestoreIpAddresses(self,s:str)->List[str]:res=[]self.backtracking(s,0,[],res)returnresdefbacktracking(self,s,start_index,path,res......