【力扣hot100】刷题笔记Day14

news2025/4/23 19:32:30

前言

  • 又是新的一周,快乐的周一,快乐地刷题,今天把链表搞完再干活!

114. 二叉树展开为链表 - 力扣(LeetCode)

  • 前序遍历

    • class Solution:
          def flatten(self, root: Optional[TreeNode]) -> None:
              if not root:
                  return
              st = [root]
              pre = None
              while st:
                  cur = st.pop()
                  # 把当前遍历结点接到上一个遍历结点上
                  if pre:
                      pre.left = None
                      pre.right = cur  
                  if cur.right:
                      st.append(cur.right)
                  if cur.left:
                      st.append(cur.left)
                  pre = cur
              return root
      
  • 前驱结点

    • class Solution:
          def flatten(self, root: Optional[TreeNode]) -> None:
              cur = root
              while cur:
                  pre = cur
                  if cur.left:
                      cur = cur.left
                      while cur.right:
                          cur = cur.right  # cur指向pre左子树的最右(前驱)
                      cur.right = pre.right  # pre右子树接在前驱上
                      pre.right = pre.left  # pre左子树移到右子树
                      pre.left = None  # pre左指针置为None
                  cur = pre.right  # cur继续往右
              return root

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

  • 递归:复制数组O(n2)

    • class Solution:
          def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
              if not preorder:
                  return None
              
              root = TreeNode(preorder[0])  # 构造根节点
              idx = inorder.index(preorder[0])  # 找到根节点在中序中的idx,O(n)
              root.left = self.buildTree(preorder[1: idx+1], inorder[0: idx])  # 递归构造左子树
              root.right = self.buildTree(preorder[idx+1:], inorder[idx+1:])   # 递归构造右子树
      
              return root
  • 递归:数组下标+哈希O(n)

    •  

    • class Solution:
          def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
              def dfs(i, l, r):
                  if r - l < 0:
                      return None  # 子树区间为空时终止
                  root = TreeNode(preorder[i])  # 初始化根节点
                  m = inorder_map[preorder[i]]  # 查询 m ,从而划分左右子树
                  root.left = dfs(i + 1, l, m - 1)  # 子问题:构建左子树
                  root.right = dfs(i + 1 + m - l, m + 1, r)  # 子问题:构建右子树
                  return root      # 回溯返回根节点
      
              # 初始化哈希表,存储 inorder 元素到索引的映射
              inorder_map = {val: i for i, val in enumerate(inorder)}
              root = dfs(0, 0, len(inorder) - 1)
              return root
  • 迭代

    • 比较难理解和模拟,可以只记上面的递归方法即可,参考官解
    • class Solution:
          def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
              if not preorder:
                  return None
      
              root = TreeNode(preorder[0])
              stack = [root]
              inorderIndex = 0
              for i in range(1, len(preorder)):
                  preorderVal = preorder[i]
                  node = stack[-1]
                  if node.val != inorder[inorderIndex]:
                      node.left = TreeNode(preorderVal)
                      stack.append(node.left)
                  else:
                      while stack and stack[-1].val == inorder[inorderIndex]:
                          node = stack.pop()
                          inorderIndex += 1
                      node.right = TreeNode(preorderVal)
                      stack.append(node.right)
      
              return root

 437. 路径总和 III - 力扣(LeetCode)

  • 双重递归

    • 两种方法思路参考题解
    • class Solution:
          # 求包含与不包含root的所有路径中满足要求的路径数
          def pathSum(self, root: TreeNode, sum: int) -> int:
              if not root:
                  return 0
              return self.dfs(root, sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)
          # 求包含root的所有路径中满足要求的路径数    
          def dfs(self, root, path):
              if not root:
                  return 0
              path -= root.val
              return (1 if path==0 else 0) + self.dfs(root.left, path) + self.dfs(root.right, path)
  •  前缀和 + 哈希

    • class Solution:
          def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int:
              prefixSumTree = {0:1}  # 前缀和:个数
              self.count = 0  # 答案
              prefixSum = 0  # 记录当前前缀和
              self.dfs(root, sum, prefixSum, prefixSumTree)
              return self.count
              
          def dfs(self, root, targetSum, prefixSum, prefixSumTree):
              if not root:
                  return 0
              prefixSum += root.val
              oldSum = prefixSum - targetSum  # 之前可能存在的等于目标和的路径和=当前前缀和-目标和
              if oldSum in prefixSumTree:
                  self.count += prefixSumTree[oldSum]  # 存在的话结果加上路径数
              prefixSumTree[prefixSum] = prefixSumTree.get(prefixSum, 0) + 1  
              # 如果不用collections.defaultdict,键不存在就返回默认值0,再+1
              
              self.dfs(root.left, targetSum, prefixSum, prefixSumTree)
              self.dfs(root.right, targetSum, prefixSum, prefixSumTree)
              
              '''一定要注意在递归回到上一层的时候要把当前层的prefixSum的个数-1,类似回溯,要把条件重置'''
              prefixSumTree[prefixSum] -= 1

 236. 二叉树的最近公共祖先 - 力扣(LeetCode)

  • 递归后序

    • class Solution:
          def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
              if not root or root == p or root == q:
                  return root
              left = self.lowestCommonAncestor(root.left, p, q)
              right = self.lowestCommonAncestor(root.right, p, q)
              if left and right: return root  # 找到祖先了
              if not left: return right   # 一边没有就返回另一边
              if not right: return left

 124. 二叉树中的最大路径和 - 力扣(LeetCode)

  • 递归后序

    • class Solution:
          def maxPathSum(self, root: Optional[TreeNode]) -> int:
              self.maxSum = -float('inf')  # 以防路径是负值
              # 递归计算左右子节点的最大贡献值
              def maxGain(node):
                  if not node:
                      return 0
                  leftGain = maxGain(node.left)    # 左贡献
                  rightGain = maxGain(node.right)  # 右贡献
                  newPath = leftGain + rightGain + node.val  # 最大路径 = 左右贡献值+当前值
                  self.maxSum = max(self.maxSum, newPath)  # 更新答案
                  return max(max(leftGain, rightGain) + node.val, 0)  # 返回贡献值,为负数就不贡献了
              maxGain(root)
              return self.maxSum   

 后言

  • 搞定二叉树咯,头好晕啊,肯定是天气冻的,晚上再简单干点活就可以玩耍咯

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

clickhouse 随心所欲的聚合模型-AggregatingMergeTree

clickhouse 强大的 MergeTree 系列引擎令人信服&#xff0c;其 ReplacingMergeTree、SummingMergeTree 在数据唯一性和汇总场景中表现非凡。但你是否还有保留最小(大)、平均等预聚合需求&#xff0c;甚至在一个模型中既有唯一性语意也有汇总、最小、最大、平均值语意该如何处理…

【Simulink系列】——Simulink与Matlab接口使用命令行进行仿真

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、Simulink与Matlab接口 1、Matlab工作区变量设置模块参数 Matlab工作区的变量可以作为模块的设置参数 2、Matlab工作区变量作为输入信号 使用From Worksp…

深度学习--神经网络基础

神经网络 人工神经网络&#xff08; Artificial Neural Network &#xff0c; 简写为 ANN &#xff09;也简称为神经网络&#xff08; NN &#xff09;&#xff0c;是一种模仿生物神经网络结构和 功能的计算模型 。人脑可以看做是一个生物神经网络&#xff0c;由众多的 神经元…

FLStudio20.8编曲制作软件中文版下载及功能全面介绍

一、主要功能 FL Studio 20.8&#xff0c;作为一款深受音乐制作人和作曲家喜爱的软件&#xff0c;具备多种核心功能&#xff0c;满足从创作到完成的整个音乐制作流程。 音频录制与编辑&#xff1a;用户可以轻松录制外部音频&#xff0c;如乐器演奏、人声等&#xff0c;并在软…

【新书推荐】8.4 逻辑运算指令

本节内容&#xff1a;逻辑运算指令。8086 CPU逻辑运算指令包括NOT、AND、OR、XOR&#xff0c;除NOT指令外&#xff0c;均有两个操作数。逻辑运算指令影响状态标志位。 ■否操作指令NOT指令格式&#xff1a;NOT OPRD。将OPRD取反&#xff0c;然后送回OPRD。操作数可以是8位/16位…

UE5 UE4 不同关卡使用Sequence动画

参考自&#xff1a;关于Datasmith导入流程 | 虚幻引擎文档 (unrealengine.com) 关卡中的Sequence动画序列&#xff0c;包含特定关卡中的Actor的引用。 将同一个Sequcen动画资源放入其他关卡&#xff0c;Sequence无法在新关卡中找到相同的Actor&#xff0c;导致报错。 Sequen…

2024国际生物发酵展览会独家解读-力诺天晟科技

参展企业介绍 北京力诺天晟科技有限公司&#xff0c;专业致力于智能仪器仪表制造&#xff0c;工业自动控制系统用传感器、变送器的研发、设计、销售和服务。 公司坐落于首都北京行政副中心-通州区&#xff0c;下设生产子公司位于河北香河经济开发区&#xff0c;厂房面积 300…

Vue NextTick工作原理及使用场景

$nextTick的定义及理解&#xff1a; 定义&#xff1a;在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM。 所以就衍生出了这个获取更新后的DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操…

GitHub标星50k的Android全栈技术知识,成为一名合格Android架构师

JNI 简介 JNI &#xff08;Java Native Interface英文缩写&#xff09;&#xff0c;译为Java本地接口。是Java众多开发技术中的一门技术&#xff0c;意在利用本地代码&#xff0c;为Java程序提供更高效、更灵活的拓展。尽管Java一贯以其良好的跨平台性而著称&#xff0c;但真正…

js 面试运行机制和存储(从以下几方面理解),栈和堆的理解

1 工作原理 每个浏览器都有自己的引擎&#xff0c;通过引擎把代码解析运行起来。 2 生命周期 3-1 内存分配 3-2 内存使用 3-3 内存回收 3 栈和堆的理解 timer也是个函数--所以也是引用类型。 4 如何运行 以下可忽略 首先声明变量&#xff0c;放在左侧栈中执行&#xff0c;在执行…

FPGA-时钟管理单元

时钟管理单元(Clock Management Tile, CMT) : 即时钟管理片,是FPGA器件中一个十分重要的时钟资源。能够对内部和外部的时钟去偏斜、去抖动,同时还支持频率合成、分倍频等功能。 举例&#xff0c;下面这个例子数据从FIFO输出时钟频率为125MHZ&#xff0c;这个时钟频率可以通过…

Redis冲冲冲——Redis的主从复制,哨兵模式以及SpringBoot的配置

目录 引出Redis的主从复制&#xff0c;哨兵模式以及SpringBoot的配置Redis的主从复制Redis的哨兵模式SpringBoot配置 缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Redis冲冲冲——Redis的主从复制&#xff0c;哨兵模式以及SpringBoot的配置…

Taro React ---- 在函数组件或类组件中访问上下文(Context)中的值

1. 解决问题的场景 项目是开发好几年了&#xff0c;当时采用的是类组件开发。现在新增需求&#xff0c;新增需求使用的函数组件&#xff0c;组件涉及的层级比较多&#xff0c;如果直接组件传值&#xff0c;比较麻烦。但是单独为这次的需求新增 redux 的引入又觉得没必要。然后在…

优化照片分辨率:如何将照片调整为150dpi,以适应不同场景?

在数字化时代&#xff0c;我们经常需要在不同场景中使用照片&#xff0c;如打印、网页发布、社交媒体分享等。然而&#xff0c;不同场景对于照片的分辨率要求各不相同。有时&#xff0c;我们需要将照片的分辨率调整为特定数值&#xff0c;例如150dpi(每英寸点数)。这样做可以确…

flutter面试题及答案,android面试题最新

前言 今天想停下代码&#xff0c;写点脑袋里不断浮现出来的一些看法。 也就是最近在微博和知乎上老看到“互联网寒冬”的说法。要么是看到啥公司薪水无法如期发放了&#xff0c;要么是看到别人说什么“裁员了&#xff0c;没有交接&#xff0c;签字然后电脑还了就走人&#xf…

【JavaEE进阶】 Spring AOP快速上手

文章目录 &#x1f343;什么是AOP&#x1f333;什么是Spring AOP&#x1f334;上手Spring AOP&#x1f6a9;引入依赖&#x1f6a9;编写AOP程序 ⭕总结 &#x1f343;什么是AOP AOP是Aspect Oriented Programming的简称&#xff08;又称为面向切⾯编程&#xff09; 什么是面向…

【k8s 访问控制--认证与鉴权】

1、身份认证与权限 前面我们在操作k8s的所有请求都是通过https的方式进行请求&#xff0c;通过REST协议操作我们的k8s接口&#xff0c;所以在k8s中有一套认证和鉴权的资源。 Kubenetes中提供了良好的多租户认证管理机制&#xff0c;如RBAC、ServiceAccount还有各种策路等。通…

练习 1 Web EasySQL极客大挑战

CTF Week 1 EasySQL极客大挑战 BUUCTF 典中典复习 Web SQL 先尝试输入&#xff0c;找一找交互页面 check.php 尝试万能语句 a’ or true SQL注入&#xff1a;#和–的作用 get传参只能是url编码&#xff0c;注意修改编码&#xff0c;输入的字符串要改成url格式。 POST请求和…

定制红酒:定制过程中的沟通与调整,确保满足您的需求

在云仓酒庄洒派的定制红酒服务中&#xff0c;沟通与调整是确保满足消费者需求的关键环节。为了提供上好的服务&#xff0c;云仓酒庄洒派非常重视与消费者的沟通&#xff0c;并根据他们的反馈进行调整&#xff0c;以确保产品符合他们的期望。 首先&#xff0c;在定制过程中&…

Fastjson2 <== 2.0.26反序列漏洞

根据Y4TACKER师傅在2023-03-20发布了一篇关于Fastjson原生反序列化的文章&#xff0c;文章中引入注目的是利用条件限制条件&#xff0c;不常常关注漏洞预警或者内容的几乎都是未发觉Fastjson2 到Fastjson2 2.0.26版本都有问题&#xff0c;其实如果单独去使用一些关键词去搜索&a…