【力扣hot100】刷题笔记Day14

前言

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

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

  • 前序遍历

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

    • class Solution:def flatten(self, root: Optional[TreeNode]) -> None:cur = rootwhile cur:pre = curif cur.left:cur = cur.leftwhile cur.right:cur = cur.right  # cur指向pre左子树的最右(前驱)cur.right = pre.right  # pre右子树接在前驱上pre.right = pre.left  # pre左子树移到右子树pre.left = None  # pre左指针置为Nonecur = 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 Noneroot = 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 Noneroot = TreeNode(preorder[0])stack = [root]inorderIndex = 0for 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 += 1node.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 0return self.dfs(root, sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)# 求包含root的所有路径中满足要求的路径数    def dfs(self, root, path):if not root:return 0path -= root.valreturn (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.countdef dfs(self, root, targetSum, prefixSum, prefixSumTree):if not root:return 0prefixSum += root.valoldSum = prefixSum - targetSum  # 之前可能存在的等于目标和的路径和=当前前缀和-目标和if oldSum in prefixSumTree:self.count += prefixSumTree[oldSum]  # 存在的话结果加上路径数prefixSumTree[prefixSum] = prefixSumTree.get(prefixSum, 0) + 1  # 如果不用collections.defaultdict,键不存在就返回默认值0,再+1self.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 rootleft = 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 0leftGain = 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.hqwc.cn/news/493791.html

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

相关文章

实现点击按钮复制内容

记录一下点击按钮复制内容的实现。 实现效果如图&#xff1a; 复制成功后Ctrlv可粘贴&#xff1a; 实现方式也比较简单&#xff1a; <template><div><p>{{ myText }}</p><el-button plain click"handleCopy">复制</el-button>…

如何保护企业免受人工智能网络钓鱼攻击

文章目录 前言一、生成式人工智能带来了新的网络安全威胁二、人工智能将使网络钓鱼攻击变得更加危险三、企业如何阻止人工智能驱动的网络钓鱼四、网络钓鱼模拟确保责任感和适应性前言 网络钓鱼是网络犯罪分子社会工程武器库中的超级武器。网络钓鱼尤其危险,因为它是网络犯罪分…

vscode输入英文时字体之间的间隔突然变大,似中文

vscode输入英文时字体之间的间隔突然变大&#xff0c;似中文 主要原因&#xff1a; 是由于输入法变成全角模式了。原因可能是不小心按了 shift空格键快捷键造成的。 正常情况&#xff0c;全角就是字母和数字等与汉字占等宽位置的字。 半角就是ASCII方式的字符&#xff0c;在没…

学习python的第7天,她不再开放她的听歌榜单

我下午登录上小号&#xff0c;打开聊天消息看到了她的回复&#xff0c;我很开心兴奋&#xff0c;可是她不再开放她的听歌榜单了&#xff0c;我感觉得到&#xff0c;我要失恋了。 “因为当年电视上看没有王菲版本的” “行”。 “那你以后还会开放听歌榜单吗&#xff1f;”我…

替代 Intercom 和 Zendesk: 开源的客户互动套件 | 开源日报 No.183

chatwoot/chatwoot Stars: 17.8k License: NOASSERTION chatwoot 是一个开源的客户互动套件&#xff0c;是 Intercom、Zendesk、Salesforce Service Cloud 等的替代品。 该项目主要功能、关键特性和核心优势包括&#xff1a; 支持多种对话渠道&#xff0c;如网站、Facebook、…

H264/H265基本编码参数1

本文主要讲解一些视频编码相关的基本概念 像素 像素是图像的基本单元&#xff0c;一个个像素就组成了图像。你可以认为像素就是图像中的一个点。我们来直观地看看像素是怎么组成图像的。在下面这张图中&#xff0c;你可以看到一个个方块&#xff0c;这些方块就是像素。 分辨…

Bentley全球COO康岷思:中国市场特别且重要

吴付标 疫情之后&#xff0c;中国再次敞开国门&#xff0c;欢迎四海友人。Bentley全球首席运营官康岷思正是其中的一位。 康岷思三年前加入Bentley管理团队。笔者在2023年10月份在新加坡召开的纵览基础设施大会暨光辉大奖盛典上第一次见到他。中国基础设施数字化先锋们所讲述的…

【Excel PDF 系列】POI + iText 库实现 Excel 转换 PDF

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言转换前后效果引入 pom 配置代码实现 前言 最近遇到生成 Excel 并转 pdf 的需求&#xff0c;磕磕碰碰总…

MySQL进阶篇2-索引的创建和使用以及SQL的性能优化

索引 mkdir mysql tar -xvf mysqlxxxxx.tar -c myql cd mysql rpm -ivh .....rpm yum install openssl-devel ​ systemctl start mysqld ​ gerp temporary password /var/log/mysqld.log ​ mysql -u root -p mysql> show variables like validate_password.% set glob…

EMQX Enterprise 5.5 发布:新增 Elasticsearch 数据集成

EMQX Enterprise 5.5.0 版本已正式发布&#xff01; 在这个版本中&#xff0c;我们引入了一系列新的功能和改进&#xff0c;包括对 Elasticsearch 的集成、Apache IoTDB 和 OpenTSDB 数据集成优化、授权缓存支持排除主题等功能。此外&#xff0c;新版本还进行了多项改进以及 B…

基于AI将普通RGB图像转换为苹果Vision Pro支持的空间照片

将 RGB 图像转换为空间图片 一、引言 随着AR和VR技术的普及,空间照片格式(.HEIC)逐渐受到关注。这种格式允许用户在AR/VR设备上体验到更为真实的立体空间效果。为了让更多的普通图片也能享受这种技术,我们开发了这款可以将普通RGB图像转换为苹果Vision Pro支持的.HEIC格式的…

计算机设计大赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…