- 博客(98)
- 收藏
- 关注
原创 C++算法练习day73——45.跳跃游戏2
贪心算法:每一步都选择当前最优解,从而希望这样的局部最优解能够导致全局最优解。边界维护:通过维护两个边界(和max_point)来跟踪当前跳跃能力和能够到达的最远位置。算法复杂度:时间复杂度为 O(n),因为我们只遍历了一次数组;空间复杂度为 O(1),因为我们只使用了几个变量来存储中间结果。这个问题是一个典型的贪心算法应用实例,通过维护两个关键的边界(和max_point),我们可以有效地计算出到达数组最后一个位置所需的最少跳跃次数。贪心算法的核心在于每一步都选择当前最优解,从而逐步逼近全局最优解。
2025-01-01 14:39:14
318
原创 C++算法练习day72——55.跳跃游戏
贪心算法:在每一步选择中都采取最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。动态规划:虽然本题可以使用动态规划解决(定义 dp[i] 为到达位置 i 所需的最小跳跃次数),但贪心算法提供了更简洁、更高效的解决方案。max 函数:用于返回两个数中的较大值。数组遍历:通过循环遍历数组的每个元素。“跳跃游戏” 是一个展示贪心算法应用的经典问题。通过维护一个rightmost变量来跟踪当前能够到达的最远位置,我们可以有效地判断是否能够到达数组的最后一个位置。
2025-01-01 14:38:44
316
原创 C++算法练习day71——122.买卖股票的最佳时机2
贪心算法:每一步都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法。局部最优解:在求解某些复杂问题时,从局部最优解出发,通过逐步构造,最终得出全局最优解。股票买卖问题:通过贪心策略,即只关注价格差来求解最大利润,而不需要记录买入和卖出的具体日期。本文讨论了一个经典的股票买卖问题,通过贪心算法的思想,我们可以简化问题,只需关注价格差来求解最大利润。这种方法不需要记录买入和卖出的具体日期,大大减少了问题的复杂性。通过贪心策略,我们能够在遍历一遍价格数组后得出全局最优解,即最大利润。
2024-12-17 13:09:08
432
原创 C++算法练习day70——53.最大子序和
一种用于解决最大子数组和问题的线性时间复杂度算法。动态规划:一种通过将问题分解为更小的子问题来解决问题的方法,通常用于优化问题。max 函数:用于比较两个值并返回其中的较大值。本文介绍了如何使用 Kadane's Algorithm 来解决最大子数组和问题。通过维护两个变量(全局最大子数组和和当前子数组和),我们可以在遍历数组时不断更新它们,并最终得到全局最大子数组和。这种方法的时间复杂度是 O(n),非常高效。希望本文能帮助大家更好地理解最大子数组和问题和 Kadane's Algorithm。
2024-12-10 22:15:52
475
原创 C++算法练习day69——376.摆动序列
边界情况处理:在处理数组、链表等数据结构时,考虑边界情况(如空数组、单个元素数组)非常重要。滑动窗口/指针技术:通过指针或索引来遍历数组,跳过不必要的计算,提高算法效率。数学判断:利用乘法判断数字间的大小关系,从而确定是否构成摆动。摆动序列问题是一个经典的算法问题,它考察了对数组遍历、边界情况处理以及数学判断的综合应用能力。通过本题,我们可以学习到如何在遍历数组时高效地跳过不必要的元素,以及如何运用数学方法(如乘法判断)来简化问题。
2024-12-10 22:15:37
495
原创 C++算法练习day68——455.分发饼干
贪心算法:贪心算法是一种在每一步选择中都采取最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。在这个问题中,我们每次都选择最小的饼干来满足当前孩子的需求。排序:排序是计算机科学中的一个基本问题,它允许我们高效地查找、合并和比较数据。在这个问题中,我们对孩子需求和饼干大小进行了排序,以便能够使用贪心算法。指针/迭代器:在C++中,指针和迭代器是用于遍历和操作容器(如数组、向量等)中的元素的工具。在这个问题中,我们使用两个指针来分别遍历孩子需求和饼干大小。
2024-12-09 10:30:21
570
原创 C++算法练习day67——37.解数独
递归:函数直接或间接地调用自身的方法。在解决数独时,递归用于尝试填入每个空位置的所有可能数字。回溯:在递归过程中,如果遇到无法继续的情况(如所有数字都尝试过但都不合法),则回溯到上一步,尝试其他选择。在解决数独时,回溯用于清空当前位置并尝试下一个数字。合法性检查:在尝试填入数字之前,需要检查这个数字在当前行、列和宫中是否已经存在。通过递归回溯法,我们可以有效地解决数独问题。首先,我们遍历整个数独网格,找到每个空位置。然后,对于每个空位置,我们尝试填入1到9的数字,并检查这个填法是否合法。
2024-12-09 10:29:51
547
原创 C++算法练习day66——51.N皇后
回溯算法:通过递归尝试所有可能的解,并在发现冲突时撤销最近的一次选择。N皇后问题:经典的组合优化问题,目标是在N×N的棋盘上放置N个互不攻击的皇后。状态表示:使用二维字符串数组表示棋盘状态,'Q'表示皇后,'.'表示空位。冲突检查:检查当前位置放置皇后是否会与已放置的皇后冲突,包括列冲突和对角线冲突。N皇后问题是一个经典的组合优化问题,通过回溯算法可以有效地找到所有可能的解。本文详细介绍了N皇后问题的解题思路,包括冲突检查、回溯算法的实现以及代码注释。
2024-12-07 11:31:38
625
原创 C++算法练习-day65——332.重新安排行程
哈希表(unordered_map):用于高效存储和查询键值对。深度优先搜索(DFS):一种用于遍历或搜索树或图的算法,通过递归实现。回溯:在DFS过程中,当当前路径不可行时,返回到上一步,尝试其他可能的路径。C++ STL容器:如vectormap和的使用。本题通过构建航班信息的哈希表,并使用深度优先搜索算法结合回溯技巧,成功地找出了从“JFK”出发,能够访问每个航班一次并最终返回“JFK”的行程路线。
2024-12-07 11:30:51
400
原创 C++算法练习-day64——47.全排列
回溯算法:一种通过递归尝试所有可能的选择来解决问题的算法。在每一步中,算法做出一个选择,并递归地继续处理剩余的问题。如果当前选择导致无法找到解决方案,算法会“回溯”到上一步,并尝试另一种选择。排序:对数组进行排序,以便在回溯过程中能够更容易地检测并跳过重复的排列。条件判断:在回溯过程中,使用条件判断来跳过那些会导致生成重复排列的选择。通过排序和回溯算法,我们可以有效地生成一个数组的所有唯一排列。排序确保了相同元素在数组中的相对位置是固定的,这有助于我们在回溯过程中检测并跳过重复的排列。
2024-12-06 13:15:54
307
原创 C++算法练习-day63——46.全排列
回溯法:一种通过递归和剪枝来生成所有可能解的算法。在这个问题中,它用于生成数组的全排列。全排列:一组元素的所有可能排列方式。数组与向量:在C++中,数组和向量都是用于存储一系列元素的容器。数组的大小在编译时确定,而向量的大小可以在运行时动态改变。在这个问题中,我们使用了向量来存储结果集和当前构建的排列。元素标记:为了避免重复使用同一个元素,我们将已经使用过的元素标记为特殊值(在这里是11这个问题是一个典型的全排列问题,通过回溯法可以有效地找出所有可能的排列组合。在回溯过程中,我们使用了一个向量pos。
2024-12-06 13:15:38
361
原创 C++算法练习-day62——491.非递减子序列
回溯法:一种通过递归地探索所有可能的候选解来找出所有解的算法。在每一步中,算法都会尝试所有可能的选项,并在必要时撤销选择(回溯),以便尝试其他选项。数组与向量:在C++中,数组和向量都是用于存储一系列元素的容器。数组的大小在编译时确定,而向量的大小可以在运行时动态改变。条件判断与循环:用于控制程序流程的基本结构。条件判断用于根据条件执行不同的代码块,而循环用于重复执行一段代码直到满足特定条件。这个问题是一个典型的回溯法问题,通过递归地探索所有可能的子序列来找出所有非严格递增子序列。
2024-12-05 19:56:53
442
原创 C++算法练习-day61——90.子集2
回溯算法:通过递归尝试构建解的一部分,并在每一步决定是否继续构建或撤销当前选择,以探索所有可能的解。递归:函数调用自身的方法,常用于解决可以分解为相似子问题的问题。向量(Vector):C++ STL中的动态数组,可以动态增长和缩小。排序:对数组进行排序,以便在回溯过程中利用排序后的性质(如跳过重复元素)。条件判断:在回溯算法中,条件判断用于确定何时停止递归(即找到了一个解)和何时回溯(即撤销当前选择,尝试其他可能的解)。通过回溯算法和排序的结合,我们可以有效地生成给定数组的所有唯一子集。
2024-12-05 19:56:33
640
原创 C++算法练习-day60——78.子集问题
回溯算法:回溯算法通过递归尝试构建解的一部分,并在每一步决定是否继续构建或撤销当前选择,以探索所有可能的解。递归:递归是一种函数调用自身的方法,常用于解决可以分解为相似子问题的问题。向量(Vector):C++ STL中的动态数组,可以动态增长和缩小。条件判断:在回溯算法中,条件判断用于确定何时停止递归(即找到了一个解)和何时回溯(即撤销当前选择,尝试其他可能的解)。通过回溯算法,我们可以有效地生成给定数组的所有子集。回溯算法的关键在于递归地构建解的一部分,并在每一步决定是否继续构建或撤销当前选择。
2024-12-04 13:05:52
938
原创 C++算法练习-day59——93.复原IP地址
回溯算法:通过递归地尝试所有可能的组合来找到所有解。字符串处理:使用string类的insert和erase方法来修改字符串。整数转换:将字符串片段转换为整数以进行检查。边界条件检查:在处理字符串和整数转换时,要注意边界条件(如字符串长度、数字范围等)。本文介绍了一个使用回溯算法来解决从给定字符串中找出所有可能的、有效的IPv4地址的问题。我们定义了辅助函数来检查一个字符串片段是否可以作为一个有效的IPv4段,并使用回溯函数来递归地构建所有可能的IPv4地址。
2024-12-04 13:05:30
543
原创 C++算法练习-day58——131.分割回文串
回文判断:通过双指针法,从字符串两端向中间遍历,比较字符是否相等。回溯算法:通过递归和撤销选择(回溯)来探索所有可能的解。字符串操作:使用substr函数提取子串。向量操作:使用vector存储结果和路径,以及进行添加和删除操作。本文介绍了一种使用回溯算法解决字符串分割成回文子串问题的方法。通过定义辅助函数判断回文子串,以及使用回溯函数探索所有可能的分割方式,我们成功地找到了所有可能的回文子串分割结果。这种方法不仅适用于本题,还可以扩展到其他类似的组合和分割问题。
2024-12-03 12:32:13
510
原创 C++算法练习-day57——225.用队列实现栈
栈(Stack):后进先出(LIFO)的数据结构,基本操作包括push(压栈)、pop(弹栈)、top(获取栈顶元素)和empty(检查栈是否为空)。队列(Queue):先进先出(FIFO)的数据结构,基本操作包括enqueue(入队)、dequeue(出队)、front(获取队首元素)和empty(检查队列是否为空)。队列与栈的转换:通过两个队列的协作,可以实现栈的功能,关键在于push操作中元素在两个队列之间的转移。std::swap:C++ 标准库中的函数,用于交换两个变量的值。
2024-12-03 12:31:54
373
原创 C++算法练习-day56——232.用栈实现队列
栈(Stack):后进先出(LIFO)的数据结构,基本操作包括push(压栈)、pop(弹栈)、top(获取栈顶元素)和empty(检查栈是否为空)。队列(Queue):先进先出(FIFO)的数据结构,基本操作包括enqueue(入队)、dequeue(出队)、front(获取队首元素)和empty(检查队列是否为空)。栈与队列的转换:通过两个栈的协作,可以实现队列的功能,关键在于swapstack函数,它负责在两个栈之间转移元素。通过使用两个栈(inStack和outStack。
2024-12-02 11:23:52
324
原创 C++算法练习-day55——40.组合总和2
回溯算法:通过递归的方式构建所有可能的解,并在满足条件时保存解。排序:排序可以帮助跳过重复的元素,减少不必要的计算。去重策略:在回溯过程中,如果当前元素与前一个元素相同,并且前一个元素已经在当前路径中被使用过,则跳过当前元素。通过这道题目,我们深入了解了回溯算法在解决组合问题中的应用。通过排序和去重策略,我们能够有效避免生成重复的组合,从而找到所有独特的、满足条件的组合。此外,这道题目也展示了如何在回溯过程中动态地构建和撤销选择,以及如何在递归函数中传递状态信息。
2024-12-02 11:23:36
452
原创 C++算法练习-day54——39.组合总和
回溯法:一种通过递归和状态重置来构建所有可能解的算法。剪枝:在搜索过程中提前终止不可能产生有效解的路径,以减少计算量。状态重置:在回溯过程中,通过撤销选择来回到之前的状态,以便尝试其他可能的解。通过这道题目,我们学习了如何使用回溯法来解决组合问题,并理解了剪枝和状态重置的重要性。回溯法是一种强大的算法,适用于解决许多组合和排列问题。在实际应用中,我们需要注意如何有效地进行剪枝,以减少不必要的计算,提高算法的效率。此外,对于涉及组合的问题,如果数组已排序,可以进一步简化问题,避免产生重复的组合。
2024-12-01 22:02:36
545
原创 C++算法练习-day53——17.电话号码的字母组合
回溯算法:通过递归和状态重置(回溯)来生成所有可能的解。递归:函数调用自身以解决问题的一部分。映射表:使用实现数字到字母的映射。字符串操作:包括字符串的拼接和字符的移除。通过这道题目,我们学习了如何使用回溯算法来解决组合生成问题。回溯算法是一种强大的工具,适用于解决许多涉及排列、组合和子集生成的问题。通过递归地构建候选解并逐步扩展,我们能够生成所有可能的解,并在必要时通过回溯来尝试其他解。此外,我们还学习了如何使用映射表来建立数字到字母的对应关系,以及如何进行字符串操作来构建和修改当前的组合。
2024-12-01 22:02:17
403
原创 C++算法练习-day52——216.组合总和3
回溯算法:一种通过构建候选解并逐步扩展直到满足问题要求或无法再扩展的算法。递归调用:函数直接或间接调用自身,用于在回溯算法中逐步构建候选解。剪枝:在搜索过程中提前终止不符合要求的候选解,以减少不必要的计算。逆序遍历:在处理类似问题时,逆序遍历可以更方便地进行剪枝。问题是一个典型的回溯算法问题,通过递归调用和剪枝来找出所有满足条件的组合。在回溯过程中,我们逐步构建当前组合,并在每一步中检查是否满足条件。如果不满足条件,则回溯并尝试其他可能的数字。逆序遍历数字可以更方便地进行剪枝,从而提高算法的效率。
2024-11-30 13:51:17
487
原创 C++算法练习-day51——77.组合
回溯算法:一种通过探索所有可能的候选解来找出所有解的算法。它通常用于解决组合、排列和子集生成等问题。递归:函数直接或间接地调用自身。在回溯算法中,递归用于探索所有可能的候选解。状态重置:在回溯过程中,当探索完一个候选解的所有可能性后,需要重置状态(即回溯),以便尝试下一个候选解。通过回溯算法,我们可以有效地生成从1到n的所有可能的k个数的组合。回溯算法的核心思想是递归地探索所有可能的候选解,并在必要时通过回溯来重置状态。
2024-11-30 13:50:55
282
原创 C++算法练习-day50——538.把二叉树转换为累加树
二叉搜索树(BST)左子树所有节点的值都小于根节点。右子树所有节点的值都大于根节点。左右子树也分别为二叉搜索树。反向中序遍历遍历顺序:右子树 -> 根节点 -> 左子树。常用于处理与BST节点值大小顺序相关的操作。全局变量与类成员变量在递归函数中,为了保存中间结果,常常使用全局变量或类成员变量。在这里,我们使用类成员变量sum来保存累加和。本文介绍了如何将一个二叉搜索树转换为累加树的问题。通过反向中序遍历,我们可以利用BST的性质,从右子树开始累加每个节点的值,并更新节点的值。
2024-11-29 22:12:28
537
原创 C++算法练习-day49——108.将有序数组转换为二叉搜索树
二叉搜索树(BST):一种特殊的二叉树,其中每个节点的值都大于其左子树所有节点的值,且小于其右子树所有节点的值。平衡二叉搜索树:每个节点的两个子树的高度差不会超过1的BST。递归:一种解决问题的方法,通过函数调用自身来解决子问题,最终将子问题的解合并得到原问题的解。分治策略:将一个大问题分成若干个小问题分别解决,然后将子问题的解合并得到原问题的解。通过将有序数组的中间元素作为当前子树的根节点,并递归构建左右子树,可以有效地将有序数组转换为平衡二叉搜索树。
2024-11-29 22:12:07
511
原创 C++算法练习-day48——669.修剪二叉搜索树
二叉搜索树(BST):一种特殊的二叉树,其中每个节点的值都大于其左子树所有节点的值,且小于其右子树所有节点的值。递归:一种在函数内部调用自身的编程技巧,常用于解决可以分解为相似子问题的问题。边界条件处理:在递归函数中,正确处理边界条件(如空节点)是避免无限递归和错误结果的关键。通过递归地修剪二叉搜索树,我们可以高效地解决给定范围内的节点修剪问题。递归方法利用了二叉搜索树的性质,使得问题可以分解为更小的子问题,从而简化了解决方案。
2024-11-28 11:23:33
331
原创 C++算法练习-day47——450.删除二叉搜索树中的节点
二叉搜索树的性质:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。删除节点的三种情况节点没有子节点:直接删除。节点有一个子节点:用子节点替换被删除的节点。节点有两个子节点:找到右子树中的最小节点(或左子树中的最大节点),将其提升到被删除节点的位置,然后递归地删除该最小(或最大)节点。
2024-11-28 11:23:02
542
原创 C++算法练习-day46——701.二叉搜索树中的插入操作
二叉搜索树(BST):一种特殊的二叉树,其中每个节点的值都大于其左子树中所有节点的值且小于其右子树中所有节点的值。节点插入:在BST中插入新节点时,根据BST的性质决定新节点的位置。遍历:通过比较新节点的值与当前节点的值,决定向左还是向右遍历树,直到找到空位置。本文介绍了如何在二叉搜索树中插入一个新节点。首先,我们讨论了BST的基本性质,然后详细分析了插入新节点的步骤,包括特殊情况的处理(树为空时)和遍历查找插入位置的过程。通过代码实例和详细的注释,我们展示了具体的实现方法,并总结了涉及的关键知识点。
2024-11-27 14:25:17
432
原创 C++算法练习-day45——236.二叉树的最近公共祖先
二叉树的基本概念:节点、左子树、右子树、根节点等。递归算法:通过函数调用自身来解决问题,特别适合树结构的问题。边界条件处理:在递归中处理各种可能的边界情况,确保算法的正确性。通过本题,我们学会了如何在二叉树中利用递归方法找到两个节点的最低公共祖先。这种方法的核心在于通过递归遍历树的每个节点,并判断给定的两个节点是否在当前节点的左右子树中。根据这个判断,我们可以确定当前节点是否是LCA。本题不仅考察了对二叉树的理解,还考察了递归算法的应用以及边界条件的处理。
2024-11-27 14:24:43
926
原创 C++算法练习-day44——501.二叉搜索树中的众树
深度优先搜索(DFS):一种用于遍历或搜索树或图的算法。在本题中,DFS 用于遍历二叉树的所有节点。递归:一种在函数内部调用自身的编程技巧。在本题中,递归用于实现 DFS。变量初始化:在函数开始时初始化所有需要的变量,以避免未定义行为。条件判断:使用if和else语句来根据当前情况更新变量和数组。通过本题,我们学习了如何使用深度优先搜索(DFS)和递归来遍历二叉树,并找出其中的众数。我们使用了几个辅助变量来跟踪当前元素的出现次数、最大出现次数以及当前遍历到的元素值。
2024-11-25 22:31:36
527
原创 C++算法练习-day43——530.二叉搜索树的最小绝对差
二叉搜索树(BST):一种特殊的二叉树,其中每个节点的值都大于其左子树所有节点的值,且小于其右子树所有节点的值。中序遍历:对于二叉搜索树,中序遍历得到的节点值序列是递增的。深度优先搜索(DFS):一种遍历或搜索树或图的算法,沿着每个分支尽可能深地搜索。最小差值问题:通过中序遍历二叉搜索树,可以找到相邻节点之间的最小差值。通过中序遍历二叉搜索树,我们可以得到一个递增的节点值序列。这个性质极大地简化了问题,使得我们只需要计算相邻节点之间的差值,并找到最小的差值。
2024-11-25 22:31:17
288
原创 C++算法练习-day42——98.验证二叉搜索树
二叉搜索树(BST):一种特殊的二叉树,满足节点的左子树只包含小于节点值的数,右子树只包含大于节点值的数,且左右子树也分别为BST。递归验证:使用递归方法验证二叉树是否是BST,通过传递当前节点和允许的值范围作为参数。边界条件:注意处理空节点和节点值超出允许范围的情况。整数溢出:为了避免整数溢出,使用long long类型来存储最小值和最大值。通过这道题目,我们学习了如何验证一个二叉树是否是有效的二叉搜索树(BST)。
2024-11-20 13:14:22
478
原创 C++算法练习-day41——700二叉搜索树中的搜索
二叉搜索树(BST):一种特殊的二叉树,满足每个节点的值都大于其左子树中所有节点的值,且小于其右子树中所有节点的值。递归搜索:在数据结构中,递归是一种常用的搜索算法,特别适用于树和图等递归结构。终止条件:在递归函数中,必须有一个明确的终止条件来防止无限递归。通过这道题目,我们学习了如何在二叉搜索树中使用递归方法进行搜索。二叉搜索树的性质使得我们可以高效地定位目标值,而递归方法则提供了一种简洁而直观的解决方案。
2024-11-20 13:13:13
476
原创 C++算法练习-day40——617.合并二叉树
二叉树遍历:二叉树的遍历方式有前序、中序和后序遍历,以及层次遍历。本题使用了递归的方式遍历二叉树。递归思想:递归是一种在函数内调用自身的编程技巧,适用于解决可以分解为相似子问题的问题。动态内存分配:使用new关键字在堆上动态分配内存,用于创建新的节点。通过这道题目,我们学习了如何使用递归方法合并两棵二叉树。递归的核心在于将大问题分解为小问题,并解决小问题,然后将结果组合起来解决大问题。在本题中,我们通过递归遍历树的每个节点,并合并对应位置的节点值,最终得到了合并后的树。
2024-11-14 23:15:33
607
原创 C++算法练习-day39——654.最大二叉树
本文介绍了两种从无序整数数组构建最大二叉树的方法:单调栈和递归。单调栈方法通过维护一个单调递减的栈来构建二叉树,而递归方法则通过递归地找到子数组中的最大值来构建二叉树。两种方法各有优缺点,单调栈方法在某些情况下可能更高效,而递归方法则更直观易懂。无论使用哪种方法,都需要对二叉树的基本结构和操作方法有深入的理解。通过这两种方法的比较和学习,我们可以更好地理解数据结构中的算法设计和优化。给定一个无序的整数数组,你需要构建一棵最大二叉树。在这棵二叉树中,每个节点的值都大于其子树中所有其他节点的值。
2024-11-14 23:14:59
376
原创 C++算法练习-day38——106.从中序和后序遍历序列构造二叉树
二叉树遍历中序遍历:左子树 -> 根节点 -> 右子树后序遍历:左子树 -> 右子树 -> 根节点递归递归是一种在函数内部调用自身的方法,常用于解决可以分解为相似子问题的问题。动态数组(vector)在C++中,vector是一个可以动态调整大小的数组,提供了方便的元素访问和操作方法。通过本题,我们学习了如何利用二叉树的中序遍历和后序遍历结果来重建二叉树。这种方法依赖于递归,通过在后序遍历中找到根节点,然后在中序遍历中分割出左右子树,再递归地对左右子树进行同样的操作。
2024-11-09 11:53:08
846
原创 C++算法练习-day36——513.找树左下角的值
广度优先搜索(BFS):一种图搜索算法,用于遍历或搜索图形数据结构中的节点。BFS从根节点开始,首先访问所有相邻的节点,然后对于每个已访问的节点,再访问它们的所有未访问过的相邻节点,以此类推,直到访问完所有节点。队列(Queue):一种先进先出(FIFO)的数据结构,常用于BFS中存储待访问的节点。二叉树:一种树形数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点。通过上述分析,我们了解了如何使用广度优先搜索(BFS)和二叉树的层次遍历来找到最底层最左边的节点的值。
2024-11-06 06:15:00
296
原创 C++算法练习-day37——112.路径总和
深度优先搜索(DFS):一种图搜索算法,用于遍历或搜索图形数据结构中的节点。DFS通过递归或栈来实现,沿着树的深度遍历节点,直到达到叶子节点或遍历完所有可能的分支。二叉树:一种树形数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点。递归:一种在函数内部调用自身的方法,通常用于解决可以分解为相似子问题的问题。通过上述分析,我们了解了如何使用深度优先搜索(DFS)来判断一棵二叉树中是否存在一条从根节点到叶子节点的路径,使得路径上所有节点的值相加等于一个给定的目标和。
2024-11-06 06:00:00
384
原创 C++算法练习-day34——257.二叉树的所有路径
二叉树:一种数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。深度优先搜索(DFS):一种用于遍历或搜索树或图的算法,尽可能深的搜索树的分支。递归:一种在函数内部调用自身的编程技巧,常用于解决可以分解为相似子问题的问题。字符串操作:在C++中,使用类进行字符串的拼接、转换等操作。向量(vector):C++标准模板库(STL)中的一种动态数组,可以存储可变数量的元素。
2024-11-05 06:00:00
607
原创 C++算法练习-day35——404.左叶子之和
叶子节点的定义:没有左子节点和右子节点的节点被称为叶子节点。递归遍历:递归是一种解决树结构问题的常用方法,通过不断地将问题分解为子问题来解决。条件判断:在编程中,使用条件判断语句(如if语句)来根据条件执行不同的代码块。累加操作:使用累加器(如变量ans)来存储和计算一系列数值的总和。通过本题,我们学习了如何判断一个节点是否是叶子节点,以及如何使用递归的方法遍历二叉树并计算特定节点的和。递归是一种强大的编程技巧,特别适用于解决树结构相关的问题。
2024-11-05 06:00:00
529
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人