代码随想录 Day 28 | 【第七章 回溯算法part 01】理论基础、77. 组合、216.组合总和III、17.电话号码的字母组合

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

一、理论基础

其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。

1. 什么是回溯

有回溯就有递归,回溯函数就是递归函数。

2. 使用原因及解决的问题

(1)使用原因:纯暴力,但有些问题必须采用回溯,因为for循环嵌套搜索失效。

(2)解决问题:

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等

注意区别:组合是不强调元素顺序的,排列是强调元素顺序。

3. 如何理解回溯法

        回溯法可以抽象为一个树形结构(N叉树),因为回溯就是一个递归的过程;回溯抽象为N叉树,横向for循环,纵向递归。

4. 回溯模板

(1)确定递归函数的参数和返回值:一般来说,回溯法没有返回值,参数较多,一开始无法直接写出参数,所以在写的过程中添加参数即可。

(2)确定终止条件:在终止条件中收集结果(if 语句)。

(3)单层递归逻辑:for循环的参数用于处理集合每一个元素,也就是for循环遍历集合的每一个参数,然后在循环中处理节点,然后进入递归过程,最后回溯(撤销处理节点的情况)。

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

 

二、77. 组合

        对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。

        在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。

        本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。

题目链接/文章讲解:代码随想录

视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili

1. 代码实现

(1)定义全局变量一维数组path和二维数组result。

(2)确定递归函数的参数和返回值:传入的参数n表示数组的大小,k表示组合的大小,startindex表示本次搜索的起始位置。 

(3)确定终止条件:抵达叶子节点,也就是path的大小等于k,然后使用result数组收集这个结果,然后返回即可。

(4)单层递归逻辑:每个节点实际上都是一个for循环,for循环中起始位置是startindex去遍历剩余元素。先把第i个元素放进path,然后进入递归,传入n、k、i+1,这样从第i+1个元素开始搜索;最后进行回溯过程,将path清空。

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        result = []
        self.backTracking(n, k, 1, [], result)
        return result

    def backTracking(self, n, k, startindex, path, result)->List[List[int]]:
        if len(path) == k:
            result.append(path[:])
            return
        for i in range(startindex, n+1):
            path.append(i)
            self.backTracking(n, k, i+1, path, result)
            path.pop()

2. 代码易错点

(1). 代码里为什么要写成result.append(path[:])而不是写result.append(path):

在这段代码中,result.append(path[:])的使用是为了确保添加到result列表中的每个组合都是path列表的一个独立副本,而不是对path的引用。这是因为path在递归过程中会被修改(通过path.append(i)和path.pop()),如果我们直接添加path本身到result中,那么当path在后续的递归中被修改时,已经添加到result中的列表也会受到影响,因为它们指向的是同一个对象。

详细解释如下:

  1. 列表是可变的:在Python中,列表是可变的数据类型。这意味着如果你将一个列表赋值给另一个变量,或者将一个列表作为元素添加到另一个列表中,这两个变量实际上引用的是同一个列表对象。因此,通过一个变量对列表所做的修改会影响到另一个变量。

  2. 递归中的状态变化:在回溯算法中,path列表用于存储当前的组合状态。随着递归的进行,path会被不断地修改(添加元素和移除元素)。

  3. 避免共享状态:当你找到一个满足条件的组合(即len(path) == k)时,你需要将这个组合保存下来。如果此时你使用result.append(path),你实际上是在向result中添加了一个对当前path状态的引用。由于path在后续的递归中会被修改,这个引用所指向的列表内容也会改变。

  4. 创建副本:为了避免这个问题,path[:]创建了一个path的浅拷贝。这意味着你得到了一个新的列表,它与path有相同的元素,但它们是两个不同的对象。因此,当path在后续的递归中被修改时,这个新列表的内容不会受到影响。

所以,result.append(path[:])确保了每个添加到result中的组合都是独立的,不会受到后续递归中path修改的影响。这是回溯算法中一个常见的技巧,用于正确处理可变数据结构在递归过程中的状态变化。

(2). 为什么使用path.pop()而不是path = []来重置path列表

在回溯算法中,使用path.pop()而不是path = []来重置path列表的原因在于它们对列表对象本身的影响不同。

  1. path.pop():
    • path.pop()方法会从path列表的末尾移除一个元素,并返回这个被移除的元素。
    • 在回溯算法中,这通常用于撤销上一次的选择,以便尝试其他可能的选择。
    • 当递归调用返回时,我们需要回到上一次的状态,以便继续搜索。使用path.pop()可以保留path列表之前的所有元素,只移除最后添加的那个元素。
  2. path = []:
    • path = []会创建一个新的空列表,并将变量path指向这个新列表。
    • 这意味着原来的path列表(以及可能包含的对它的引用)将被丢弃,所有之前添加到path中的元素都将丢失。
    • 在回溯算法中,如果我们使用path = []来重置列表,我们将无法撤销上一次的选择,因为我们已经丢弃了包含之前所有选择的原始列表。

在回溯过程中,我们需要能够回溯到之前的每一步,以便尝试所有可能的选择。为了实现这一点,我们必须保留每一步的状态,并在需要时能够撤销选择。path.pop()允许我们这样做,因为它只移除最后添加的元素,而不影响列表中的其他元素。

因此,在回溯算法中,我们通常使用path.pop()(或类似的撤销操作)来回到上一步的状态,而不是创建一个全新的列表并丢弃之前的状态。这样做可以确保我们能够正确地遍历所有可能的解,并且每个解都是基于之前步骤的有效选择构建的。

3. 组合问题的剪枝操作

所以,可以剪枝的地方就在递归中每一层的for循环所选择的起始位置。

如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了。

class Solution:
    def backTracking(self, n, k, startindex, path, result)->List[List[int]]:
        if len(path) == k:
            result.append(path[:])
            return
        for i in range(startindex, n-(k-len(path))+2):
            path.append(i)
            self.backTracking(n, k, i+1, path, result)
            path.pop()

    def combine(self, n: int, k: int) -> List[List[int]]:
        result = []
        path = []
        self.backTracking(n, k, 1, path, result)
        return result

 

三、216.组合总和III

如果把 组合问题理解了,本题就容易一些了。

1. 代码实现

(1)首先定义变量result(存放结果集)和path(收集组合)。

(2)确定递归函数的参数和返回值:参数targetSum相当于题目中相加为n;k是要求的组合数,用于控制树的深度;sum是当前组合数的加和,用于与targetSum进行比较;startindex用于控制当前递归层取数的起始位置,初始化为1开始。

(3)确定终止条件:当path的长度等于要求的k,那么终止递归;然后判断组合的和等于targetSum,那么它是满足目标值的组合,放进结果集。

(4)单层递归逻辑:for循环,从startindex开始(相当于从1开始,因为题目说明了数字从1-9),到9结束:遍历i,就把i加入进sum中,同时集合path收集i,然后继续递归,传入targetsum、k、sum、i+1。然后进行回溯,sum-i,将path弹出。

(5)剪枝操作(本题有组合个数和组合总和均有要求,因此可以从这两个角度剪枝):如果sum>targetsum,可以直接return,没有必要再递归了;此外,从元素角度进行考虑可以剪枝,如果横向元素个数不足k,那么继续向后遍历也没有意义,无法凑成元素个数为k的组合。

class Solution:
    def backTracking(self, targetSum, sum, k, startindex, path, result):
        if targetSum < sum: return
        if len(path) == k:
            if sum == targetSum:
                result.append(path[:])
            return
        for i in range(startindex, 9-(k-len(path))+2):
            sum += i
            path.append(i)
            self.backTracking(targetSum, sum, k, i+1, path, result)
            sum -= i
            path.pop()

    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        result = []
        path = []
        self.backTracking( n, 0, k, 1, path, result)
        return result

四、17.电话号码的字母组合

本题大家刚开始做会有点难度,先自己思考20min,没思路就直接看题解。

1. 代码实现

(1)定义字符串string,用于收获单个结果;定义string类型的数组result,用于收集结果。 

(2)确定递归的返回值和参数:参数digits是字符串类型,参数index表明当前递归到哪一个数字了。

(3)确定终止条件:index指向空才能结束递归,因为如果指向最后一个数字就终止的话,最后一个数字没有得到下面的递归处理,导致结果集不完整。在叶子节点收获结果:将path放入结果集result,最后return。

(4)单层递归逻辑:由于digit是一个字符串,所以需要将里面的字符单独取出来,将字符数字转变为真正的数字。然后根据这个数字,在map里面找数字对应的字符串。for循环在字符串里获取字符,将字符放进自定义的字符串里,继续递归,传入digits和index+1(在另一个字符串里进行搜索);最后进行回溯string.pop()。

class Solution:
    def __init__(self):
        self.lettermap=[           
            "abc",  # 2
            "def",  # 3
            "ghi",  # 4
            "jkl",  # 5
            "mno",  # 6
            "pqrs", # 7
            "tuv",  # 8
            "wxyz"  # 9
        ]
        self.result = []
        self.s = ''

    def backTracking(self, digits, index):

        if index == len(digits):
            return self.result.append(self.s)
        digit = int(digits[index])
        letter = self.lettermap[digit-2]

        for i in range(len(letter)):
            self.s += letter[i]
            self.backTracking(digits, index+1)
            self.s = self.s[:-1]

    def letterCombinations(self, digits: str) -> List[str]:
        if len(digits) == 0: 
            return self.result
        self.backTracking(digits,0)
        return self.result

2. 代码易错点

        不可以对字符串(str)对象使用 .append() 方法,因为字符串并没有这个方法。.append() 方法是用于列表(list)的,用于在列表末尾添加一个新的元素。字符串可以用join()或直接相加减。

GMSL2摄像头接入避坑指南:从FMC子卡配置到V4L2调用的完整流程(附Ubuntu20.04实测) 本文详细解析了GMSL2摄像头接入的全流程,从FMC子卡配置到V4L2调用的完整指南。基于XC7Z100平台实测经验,提供了硬件选型、带宽优化、Linux驱动配置及高分辨率采集的实战技巧,帮助开发者规避常见问题,提升系统稳定性与性能。 阅读详情

相关推荐

3D美术14——max——fbx导入max后直接生成bip人形骨骼插件

最近经常会从unity里反八FBX到max里进行2次修改。 但是非常尴尬的事情就是,就是用max做的fbx,你在反导入回来,BIP骨骼都会变成预制体。这个时候有一个方法补救。那就是在导入的时候调整一下参数。(如下图) 把这里调整成设置为骨骼。就还可以了。 但是,如果你不是用max做的FBX。呵呵,那么你一定很头大,因为完全没有用。 所以,这个时候就要上插件了。 Autofbxtobip v.1.1 这个插件适用于2015及其以上版本。 在这之前我还用过一款叫BIPPY,但是效果相当感人,照着这个图片调整

qq_37576129的博客 1万+

代码随想录算法训练营day22(python版)|第七章 回溯算法part01 |77. 组合·216.组合总和III·17.电话号码的字母组合

如果从某个 i 开始,后面剩下的数字总数都不够把“还差的”补齐,就没必要试了。其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。对着 在 回溯算法理论基础 给出的 代码模板,来做本题组合问题,大家就会发现 写回溯算法套路。在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路。1→再选 2 → [1,2] 满了,存;

qq_43752779的博客 952

ESP32-S3开发板实战:5分钟搞定智能门铃的音视频通话功能(附源码)

本文详细介绍了如何利用乐鑫ESP32-S3开发板快速实现智能门铃的实时音视频通话功能。通过ESP-ADF框架和RTC服务,开发者可在五分钟内完成环境搭建与核心功能调试,并附有源码和关键配置详解,为嵌入式音视频应用开发提供了高效实践路径。

web99的专栏 527

代码随想录 day 22 回溯算法 part01

其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。

2401_88561446的博客 506

保姆级教程:Halcon 3D点云匹配与差异分析避坑指南(从采样到可视化)

本文提供了一份详细的Halcon 3D点云匹配与差异分析实战指南,涵盖从模型准备到可视化的全流程。重点解析了STL文件读取单位误区、点云采样密度优化、表面模型创建技巧以及差异分析的专业手法,帮助用户避开常见陷阱,提升工业检测效率与精度。

weixin_33728268的博客 402

51单片机STC8G1K08驱动ws2812记录

使用51单片机控制17个2812灯,这里选择STC8芯片,最大频率可以达到35M,参考网上的各种文章案例,使用定时器做的时候实测做不到规格书要求的245-345ns,STC8G1K08不带PWM,所以只能使用nop来做,好在单片机在这里只有做编程灯的功能,省略测试过程,下面是程序,使用的是24MHz内部晶振 //设置一个灯珠 void SendOnePix(unsigned char *ptr) { unsigned char i,j; unsigned char temp; fo...

的博客 7320

代码随想录 day19:第七章 回溯算法part01

回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数,指的都是一个函数。虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。

z25735的博客 542

【开源训练数据集2】10个最适合机器学习的股票市场数据集

​随着加密货币在世界各地的兴起,人们现在有比以往更多的投资方式。然而,这并不像低买高卖那么简单。如果你能准确预测股市,你就会成为地球上最富有的人之一。因此,之前已经有关于如何利用情绪分析来预测股市的研究。对于那些希望构建类似预测模型的人,本文将介绍 10 个用于机器学习的股票市场和加密货币数据集。

u010542847的博客 2139

代码随想录算法训练营DAY22第七章 回溯算法part01

【代码】代码随想录算法训练营DAY22第七章 回溯算法part01。

2401_88089822的博客 56

IBM V3700更换控制器2(503错误)

正常的node1 ,机器代码版本:7.5.0.3, 机器代码构建:115.51.1509171734000。耐心等待后,刷新,看到node2,状态变成 节点状态:服务,错误:656,版本和node1一样了。新换的node2 ,机器代码版本:7.2.0.5, 机器代码构建:87.8.1404221000。耐心等待,刷新,node2,状态看到了,节点状态:活动,错误 724 1 1 0。拔出故障的控制,把内存和HBA卡,电池换到新的控制器。新的控制还是报错无法使用,节点状态:服务 错误:503。

klyshao的博客 4447

26届数字IC秋招笔试面试全攻略-ASIC设计流程全解析

本文系统介绍了ASIC芯片设计的全流程。前端设计包括规格制定、架构设计、RTL编码和功能验证;后端设计完成物理实现,涵盖布局规划、时钟树综合、布线和物理验证等步骤;Tapeout阶段完成制造数据准备和交付。文章详细说明了各阶段的关键任务、验证方法和设计指标,并列举了典型工具链,为ASIC设计提供了全面的流程指导。通过严格的检查清单和验证步骤,确保芯片设计符合制造要求和性能目标。

2301_79143213的博客 365

day 22 第七章 回溯算法part01代码随想录算法训练营71期

多个集合间的组合问题,每个数字对应独立的字符集合。:输入为空字符串时需特殊处理。

gu_xin_的博客 55

Vue和Vue-Element-Admin(六):集成中的CORS(跨域资源共享)问题

在vue-element-admin登录集成时候碰到跨域资源共享问题,CORS(Cross-origin resource sharing)是浏览器的技术规范,浏览器可以发起跨域请求但Javascript脚本不能,传统的ajax只能获取在同域名下的资源,但Html5允许ajax发起跨域请求,解决方案有:JSONP、Flash、IFrame、CORS。 一、CORS(跨域资源共享)问题 针对vue-element-admin的登录模块的后端接口完成后,前端调用时候出现报错,因为前端的端口是9527而后.

叶子叶来 9614

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 218

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 314

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 590

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 750

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 370

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 171

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 409

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 85

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 218

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 178

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 353

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 399
上一篇: 代码随想录 Day 27 | 【第六章 二叉树part 08】669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结
下一篇: 代码随想录 Day 29 | 【第七章 回溯算法 part02】39. 组合总和、40.组合总和II、131.分割回文串
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值