文章目录

    • 题目一:路径总和 II(LeetCode 113)
      • 题目分析:
      • 解题思路:
      • 示例代码:
      • 代码解析:
    • 题目二:颜色分类(LeetCode 75)
      • 题目分析:
      • 解题思路:
      • 示例代码:
      • 代码解析:
    • 题目三:验证二叉搜索树(LeetCode 98)
      • 题目分析:
      • 解题思路:
      • 示例代码:
      • 代码解析:

🌈你好呀!我是 山顶风景独好
🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊
🌸愿您在此停留的每一刻,都沐浴在轻松愉悦的氛围中。
📖这里不仅有丰富的知识和趣味横生的内容等您来探索,更是一个自由交流的平台,期待您留下独特的思考与见解。🌟
🚀让我们一起踏上这段探索与成长的旅程,携手挖掘更多可能,共同进步!💪✨

题目一:路径总和 II(LeetCode 113)

题目分析:

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。例如:输入root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22,输出[[5,4,11,2],[5,8,4,5]]。

解题思路:

回溯法:通过递归遍历二叉树,记录从根节点到当前节点的路径,当到达叶子节点且路径和等于目标和时,将路径加入结果集。
路径记录:使用列表存储当前路径上的节点值,递归进入子节点时添加节点值,回溯时移除节点值。
终止条件:当当前节点为叶子节点(左右子节点均为空)时,判断路径和是否等于目标和,若相等则保存路径。

示例代码:

# 二叉树节点定义
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef pathSum(root, targetSum):result = []def backtrack(node, current_path, current_sum):if not node:return# 将当前节点加入路径current_path.append(node.val)current_sum += node.val# 到达叶子节点且路径和等于目标值if not node.left and not node.right:if current_sum == targetSum:result.append(current_path.copy())# 递归遍历左右子树backtrack(node.left, current_path, current_sum)backtrack(node.right, current_path, current_sum)# 回溯:移除当前节点current_path.pop()backtrack(root, [], 0)return result# 辅助函数:根据列表构建二叉树(简化版,仅用于测试)
def build_tree(values):if not values:return Noneroot = TreeNode(values[0])queue = [root]i = 1while queue and i < len(values):node = queue.pop(0)if values[i] is not None:node.left = TreeNode(values[i])queue.append(node.left)i += 1if i < len(values) and values[i] is not None:node.right = TreeNode(values[i])queue.append(node.right)i += 1return root# 测试示例
if __name__ == "__main__":# 构建示例二叉树:[5,4,8,11,null,13,4,7,2,null,null,5,1]values = [5,4,8,11,None,13,4,7,2,None,None,5,1]root = build_tree(values)targetSum = 22result = pathSum(root, targetSum)print("路径总和等于{}的路径:".format(targetSum), result)  # 输出:[[5,4,11,2],[5,8,4,5]]

代码解析:

backtrack函数递归遍历二叉树,参数包括当前节点、当前路径列表、当前路径和。
每次进入节点时,将节点值加入路径并更新路径和;若为叶子节点且路径和等于目标值,则复制当前路径加入结果集。
递归遍历左右子树后,执行回溯操作(弹出当前节点值),确保路径列表正确反映上层节点的路径。
时间复杂度为O(n²)(n为节点数,最坏情况下每个节点都需复制路径,路径长度为O(n)),空间复杂度为O(n)(递归栈深度和路径列表长度)。

题目二:颜色分类(LeetCode 75)

题目分析:

给定一个包含红色、白色和蓝色、共n个元素的数组nums,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数0、1和2分别表示红色、白色和蓝色。必须在不使用库内置的排序函数的情况下解决这个问题。例如:输入nums = [2,0,2,1,1,0],输出[0,0,1,1,2,2]。

解题思路:

三指针法:使用三个指针(left、current、right)分别追踪0的右边界、当前遍历位置、2的左边界。
遍历逻辑:

  • 若current指向0,交换left和current的值,left和current同时右移(确保0在左侧);
  • 若current指向1,无需交换,current右移;
  • 若current指向2,交换current和right的值,right左移(确保2在右侧),current不动(需重新检查交换后的值)。
    终止条件:当current > right时,所有元素排序完成。

示例代码:

def sortColors(nums):"""Do not return anything, modify nums in-place instead."""left = 0  # 0的右边界(left左侧全为0)current = 0  # 当前遍历位置right = len(nums) - 1  # 2的左边界(right右侧全为2)while current <= right:if nums[current] == 0:# 交换0到左侧nums[left], nums[current] = nums[current], nums[left]left += 1current += 1elif nums[current] == 1:# 1无需交换,直接移动currentcurrent += 1else:  # nums[current] == 2# 交换2到右侧nums[current], nums[right] = nums[right], nums[current]right -= 1# 测试示例
if __name__ == "__main__":nums = [2,0,2,1,1,0]sortColors(nums)print("排序后的颜色数组:", nums)  # 输出:[0,0,1,1,2,2]

代码解析:

三指针分工明确,left确保左侧全为0,right确保右侧全为2,current负责遍历中间的1(或待处理元素)。
通过一次遍历完成排序,所有交换操作均在原数组上进行,无需额外空间。
时间复杂度为O(n)(仅遍历一次数组),空间复杂度为O(1)(只使用三个指针变量),实现了原地排序。

题目三:验证二叉搜索树(LeetCode 98)

题目分析:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
    例如:输入root = [2,1,3],输出true;输入root = [5,1,4,null,null,3,6],输出false(4的左子树包含3,小于5)。

解题思路:

中序遍历:二叉搜索树的中序遍历结果是严格递增的,可通过验证中序遍历序列是否递增来判断。
递归验证:通过递归函数传递当前节点值的合法范围(下界和上界),确保左子树所有节点值小于当前节点值,右子树所有节点值大于当前节点值。
边界处理:使用负无穷和正无穷作为初始上下界,空树视为有效的二叉搜索树。

示例代码:

# 二叉树节点定义
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef isValidBST(root):def helper(node, lower, upper):# 空树是有效的if not node:return True# 当前节点值必须在(lower, upper)范围内val = node.valif val <= lower or val >= upper:return False# 左子树的上界为当前节点值,右子树的下界为当前节点值return helper(node.left, lower, val) and helper(node.right, val, upper)# 初始范围为(-无穷, +无穷)return helper(root, float('-inf'), float('inf'))# 辅助函数:构建二叉树(同题目一)
def build_tree(values):if not values:return Noneroot = TreeNode(values[0])queue = [root]i = 1while queue and i < len(values):node = queue.pop(0)if values[i] is not None:node.left = TreeNode(values[i])queue.append(node.left)i += 1if i < len(values) and values[i] is not None:node.right = TreeNode(values[i])queue.append(node.right)i += 1return root# 测试示例
if __name__ == "__main__":# 示例1:[2,1,3]root1 = build_tree([2,1,3])print("是否为有效二叉搜索树1:", isValidBST(root1))  # 输出:True# 示例2:[5,1,4,None,None,3,6]root2 = build_tree([5,1,4,None,None,3,6])print("是否为有效二叉搜索树2:", isValidBST(root2))  # 输出:False

代码解析:

helper函数递归验证每个节点是否在合法范围内:左子树的所有节点必须小于当前节点值(上界为当前节点值),右子树的所有节点必须大于当前节点值(下界为当前节点值)。
初始调用时,下界为负无穷,上界为正无穷,确保根节点值合法。
若所有节点都满足范围约束,则返回true,否则返回false。
时间复杂度为O(n)(每个节点访问一次),空间复杂度为O(n)(递归栈深度,最坏情况下为链状树)。


✨ 这就是今天要分享给大家的全部内容了,我们下期再见!😊
🏠 我在CSDN等你哦!我的主页😍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92779.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92779.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92779.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器

在使用 FastMCP 开发 MCP 服务器时经常会用到 mcp.tool() 等装饰器。虽然它们用起来很简单&#xff0c;但当作黑匣子总让人感觉"不得劲"。接下来我们将深入相关的源码实现&#xff0c;别担心&#xff0c;不会钻没有意义的“兔子洞”&#xff0c;你可以通过这篇文章了…

Spring Boot 2.0 升级至 3.5 JDK 1.8 升级至 17 全面指南

一、版本升级背景升级动机 Spring Boot 2.0 到 3.5 的重大更新&#xff08;如Jakarta EE 9包路径变更、GraalVM支持等&#xff09;JDK 1.8 到 17 的语言特性升级&#xff08;如sealed class、record等&#xff09;安全性与性能优化需求升级目标 兼容性验证依赖库版本适配代码兼…

级数学习笔记

级数学习笔记 一、数学基础 1. 数项级数&#xff08;Number Series&#xff09; 数项级数是指形如&#xff1a; ∑(n1 to ∞) aₙ a₁ a₂ a₃ ...的无穷和。 1.1 收敛性判别法 比较判别法比值判别法根值判别法积分判别法莱布尼茨判别法&#xff08;交错级数&#xff09; 2…

Linux811 YUM;SHELL:if else fi,for

vsftpdok [rootweb ~]# vim vsftpdok.sh 您在 /var/spool/mail/root 中有新邮件 [rootweb ~]# cat vsftpdok.sh rpm -ql vsftpd >/dev/null 2>&1 if [ $? -eq 0 ];then echo "OK" else yum install vsftpd -y if [ $? -eq 0 ];then echo "install o…

运维学习Day20——MariaDB数据库管理

文章目录MariaDB 数据库管理介绍 MariaDB数据库介绍数据库种类关系数据库MariaDB 介绍部署 MariaDB安装 MariaDB加固 MariaDB连接 MariaDB配置 MariaDBMariaDB 中 SQL描述 SQL连接数据库数据库操作查询数据库列表使用数据库创建数据库删除数据库表操作环境准备查询表查询表列表…

itertools:迭代器函数

文章目录一、合并和分解迭代器1、chain&#xff1a;首尾相接2、zip / zip_longest&#xff1a;对齐取数3、islice&#xff1a;切片4、tee&#xff1a;分裂二、转换输入1、map / starmap&#xff1a;函数映射三、生成新值1、count&#xff1a;生成连续整数2、repeat&#xff1a;…

【AI论文】序列标注任务广义化研究(SFT广义化):基于奖励修正的强化学习视角

摘要&#xff1a;我们针对大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的监督微调&#xff08;Supervised Fine-Tuning&#xff0c;SFT&#xff09;提出了一种简单但具有理论依据的改进方法&#xff0c;以解决其与强化学习&#xff08;Reinforcemen…

(已解决)Mac 终端上配置代理

说明&#xff1a;为了便于理解&#xff0c;本文描述略显“抽象”与“潦草”&#xff0c;为了过审&#xff0c;仅供学习交流使用。&#x1f680; 简洁流程版启动工具 点击图标&#xff0c;复制它给出的终端命令将这段内容粘贴进你的配置文件中&#xff08;~/.zshrc 或 ~/.bash_p…

Anti-Aliasing/Mip-NeRF/Zip-NeRF/multi-scale representation

前言 CSDN的文章写太多&#xff0c;都不记得之前写的有什么了&#xff0c;但习惯了在这里记录&#xff0c;先写上吧。关于multi-scale representation又是看着忘着&#xff0c;还是写下点什么比较啊。时看时新&#xff0c;还是想吐槽自己看论文太不认真了。下面直接按照文章顺序…

板块三章节3——NFS 服务器

NFS 服务器 NFS 服务介绍 NFS 是Network File System的缩写&#xff0c;即网络文件系统&#xff0c;最早由Sun公司开发&#xff0c;**用来在UNIX&Linux系统间实现磁盘文件共享的一种方法。**它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。NFS客户端&…

数学建模——最大最小化模型

1.概念最大最小化模型&#xff08;Maximin Model&#xff09;是一种优化方法&#xff0c;旨在最大化最坏情况下的收益或最小化最坏情况下的损失。常见的现实问题有&#xff1a;求最大值的最小化问题最大风险的最低限度最小化最坏情况下的损失等2.一般数学模型 (找最大值里面最小…

【JAVA】使用系统音频设置播放音频

代码直接可以运行 import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;public class SystemDefaultAudioPlayer {// 强制使用的通用音频格式private st…

[CSP-J 2021] 小熊的果篮

题目 12代码 #include <bits/stdc.h> using namespace std; const int N2e55; struct node{int pre,//上一个水果块(对于水果就是上个水果)l,//块开始的序号&#xff0c;左边界 d,//块类型&#xff0c;0/1id,//水果序号 r,//块结束的序号&#xff0c;右边界 next;//下一块…

【C++】STL二叉搜索树——map与set容器的基础结构

目录 前言 1.二叉搜索树的概念 1.1基本结构 1.2性能分析 2.二叉搜索树的实现 2.1创建 2.2插入 2.3查找与遍历 2.4删除 3.二叉搜索树类代码 前言 C中STL的map与set容器广泛应用于实践过程中&#xff0c;本文将详细分析容器最基础的二叉搜索树结构&#xff0c;为后续map…

基于Spring Boot和SSE的实时消息推送系统

一、SSE技术深度解析 1.1 协议工作原理 #mermaid-svg-u7ZBlEsXcn68R5a8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-icon{fill:#552222;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-text{fi…

Day 40 训练和测试的规范写法

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代…

分析代码并回答问题

代码 <template><div>Counter: {{ counter }}</div><div>Double Counter: {{ doubleCounter }}</div> </template><script setup lang"ts"> import { ref, computed } from "vue";const counter ref(0);const …

在macOS上扫描192.168.1.0/24子网的所有IP地址

在macOS上扫描192.168.1.0/24子网的所有IP地址&#xff0c;可以通过终端命令实现。以下是几种常用方法&#xff1a; 使用ping命令循环扫描 打开终端执行以下脚本&#xff0c;会逐个ping测试192.168.1.1到192.168.1.254的地址&#xff0c;并过滤出有响应的IP&#xff1a; for i …

Java基础05——类型转换(本文为个人学习笔记,内容整理自哔哩哔哩UP主【遇见狂神说】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)

Java基础05——类型转换 类型转换 由于Java是强类型语言&#xff0c;所以要进行有些运算的时候&#xff0c;需要用到类型转换。 如&#xff1a;byte(占1个字节)&#xff0c;short(占2个字节)&#xff0c;char(占2个字节)→int(4个字节)→long(占8个字节)→float(占4个字节)→do…

mysql基础(二)五分钟掌握全量与增量备份

全量备份 Linux环境 数据备份 数据库的备份与恢复有多中方法&#xff0c;通过mysql自带的mysqldump工具可对数据库进行备份。语法&#xff1a; mysqldump -u username -p password --databases db_name > file_name .sql说明&#xff1a; -u参数指定用户名&#xff0c;usern…