LeetCode 637, 67, 399

文章目录

  • 637. 二叉树的层平均值
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 67. 二进制求和
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 399. 除法求值
    • 题目链接
    • 标签
    • 思路
      • 导入
      • value 属性
      • find() 方法
      • union() 方法
      • query() 方法
    • 代码


637. 二叉树的层平均值

题目链接

637. 二叉树的层平均值

标签

树 深度优先搜索 广度优先搜索 二叉树

思路

本题考查了二叉树的 层序遍历,层序遍历的思想是 广度优先搜索,广度优先搜索需要使用 队列,操作如下:

  1. 创建一个队列,用于保存每层节点。
  2. 先将根节点放入队列,代表遍历第一层。
  3. 只要队列不为空,就进行如下操作:
    1. 获取本层节点的个数。
    2. 遍历本层的所有节点,遍历操作如下:
      1. 取出当前节点。
      2. 如果当前节点的左子节点不为 null,则将其放到队列中,等待下一层节点的遍历。
      3. 如果当前节点的右子节点不为 null,则将其放到队列中,等待下一层节点的遍历。
      4. 针对当前节点进行某种操作:使用一个变量统计本层节点之和。
    3. 针对本层节点进行某种 统计 操作:计算本层节点的平均值,并将其放到结果链表中。
  4. 遍历完整个二叉树,返回结果。

代码

class Solution {public List<Double> averageOfLevels(TreeNode root) {List<Double> res = new ArrayList<>(); // 存储结果(每层节点的平均值)的链表LinkedList<TreeNode> queue = new LinkedList<>(); // 保存每层节点的队列queue.offer(root); // 先将根节点放入队列,即遍历第一层while (!queue.isEmpty()) { // 直到队列为空,才退出循环double sum = 0; // 计算本层节点的和int size = queue.size(); // 获取本层节点的数量for (int i = 0; i < size; i++) { // 遍历本层所有节点TreeNode curr = queue.poll(); // 取出 当前节点TreeNode left = curr.left; // 获取当前节点的 左子节点if (left != null) { // 如果 左子节点 不为 nullqueue.offer(left); // 则将其放到队列中,等待下一层遍历}TreeNode right = curr.right; // 获取当前节点的 右子节点if (right != null) { // 如果 右子节点 不为 nullqueue.offer(right); // 则将其放到队列中,等待下一层遍历}sum += curr.val; // 求和}res.add(sum / size); // 计算平均值}return res;}
}

67. 二进制求和

题目链接

67. 二进制求和

标签

位运算 数学 字符串 模拟

思路

本题是一道 模拟题,如果是十进制,则本题就是 高精度 问题,以下写出一种模版,只需要改变 base 进制,就可以使用不同的进制进行计算。

可以想一想小学一年级学的 列竖式计算两数之和,高精度的解决方案就是它:

  1. 将两个数的个位对齐,写出来。
  2. 对每一位,有如下操作:
    1. 将两个数的相同位加在一起。此外,还要加上 进位 carry,进位是通过 n 进一 得到的,这里的 n 就是进制。如果有一个数的位数不够,则认为这个数的这一位为 0
    2. 对于加起来的和,如果它大于进制,则进一,并将剩余的数(和 对 进制 取余)写在结果的这一位上;否则直接将和写在结果的这一位上。
  3. 最后,看是否还应该进位,如果需要,则再添加一位 1

由于 题目传入的字符串和要求返回的字符串都是从高位到低位的,而 在计算时是从低位到高位的,所以要注意在计算时颠倒字符串,并将计算结果反转之后再返回。

代码

class Solution {public String addBinary(String a, String b) {final int base = 2; // 进制,本题为 二进制StringBuilder builder = new StringBuilder(); // 拼接数字的拼接器char[] aC = a.toCharArray(), bC = b.toCharArray();int aLen = aC.length, bLen = bC.length;int len = Math.max(aLen, bLen); // 获取较长字符串的长度int carry = 0; // 是否要进一,如果要进一,则为 1;否则为 0for (int i = 0; i < len; i++) {// 注意 aC/bC[i] 是字符,需要通过 减去 '0' 来将其转化为 数字int operand1 = i < aLen ? (aC[aLen - i - 1] - '0') : 0;int operand2 = i < bLen ? (bC[bLen - i - 1] - '0') : 0;int sum = operand1 + operand2 + carry;carry = sum / base; // 查看是否需要进一sum %= base; // 获取剩余的数builder.append(sum);}if (carry > 0) { // 如果还需要进位builder.append(1); // 则再添加一位 1}builder.reverse(); // 先将结果反转return builder.toString(); // 再返回}
}

399. 除法求值

题目链接

399. 除法求值

标签

深度优先搜索 广度优先搜索 并查集 图 数组 字符串 最短路

思路

导入

本题不算中等题,理应为困难题,主要与 并查集数学 有关,操作十分复杂。可以先看看 990. 等式方程的可满足性,990 题是本题的简单版本,尽量理解 990 题中的并查集的使用。此外,希望大家看一看并查集的 路径压缩,这在本题中很重要。

value 属性

如果能够理解 990 题,那么离解决本题就不远了。本题的并查集中每个节点都比 990 题多了一个值 value,其保存了 本节点 与 其父节点 的比值,即有 v a l u e [ i ] = i p a r e n t [ i ] value[i] = \frac{i}{parent[i]} value[i]=parent[i]i 请记住这点,在 find()union() 中很重要。注意:其中的 i, parent[i] 不是索引,没有实际意义,只是充当有逻辑意义的占位符,这个比值是从 values 数组中获得的。

find() 方法

find() 时需要 压缩路径,因为这样可以避免一些计算。例如下面的并查集,如果想要查询 xrootX 的比值,就必须计算两次;但如果直接让 x 指向 rootX,这时只需要获取 value[x] 即可。具体的操作为先保存父节点,再递归获取根节点,最后更新本节点的 value,从 本节点与父节点的比值 变为 本节点与根节点的比值。等式如下: x r o o t X = x y ∗ y r o o t X \frac{x}{rootX} = \frac{x}{y} * \frac{y}{rootX} rootXx=yxrootXy ,即 value[x] = value[x] * value[y],其中的 y 为未变更之前 x 的父节点。
alt text

union() 方法

union() 方法中,不仅要传递 x, y 的索引,还要传递 value = x / y 的值。先获取 xy 的根节点(获取根节点的时候就让 x, y 指向其根节点 rootX, rootY 了,如下图),如果根节点一样,则直接返回;否则就需要让 rootX 指向 rootY,并更新 rootXvalue。等式如下: r o o t X r o o t Y = y r o o t Y x y r o o t X x \frac{rootX}{rootY} = \frac{y}{rootY} \frac{x}{y} \frac{rootX}{x} rootYrootX=rootYyyxxrootX ,即有 value[rootX] = value[y] * value / value[x]
alt text
本题还有一个比较麻烦的点:等式中的变量不一定只有一个小写字母。所以需要建立 等式中的变量(以下称作 操作元)与 其在并查集中的索引 的映射,具体请看代码。

query() 方法

由于需要查询某两个操作元之间的比值,还需要在并查集中实现一个方法 query(),如果两个操作元对应的索引在并查集中不连通,则返回 -1;否则返回比值 value[x] / value[y]。等式如下(如果 x, y 连通,则其根节点相同,假设为 root): x y = x r o o t r o o t y \frac{x}{y} =\frac{x}{root} \frac{root}{y} yx=rootxyroot ,即 x / y = value[x] / value[y]

代码

class Solution {public double[] calcEquation(List<List<String>> equations,double[] values, List<List<String>> queries) {// 先初始化并查集init(equations, values);// 再进行查询int queriesSize = queries.size();double[] res = new double[queriesSize];for (int i = 0; i < queriesSize; i++) {List<String> query = queries.get(i);String operand1 = query.get(0); // 操作元1String operand2 = query.get(1); // 操作元2Integer idx1 = indexMapper.get(operand1); // 操作元1的索引Integer idx2 = indexMapper.get(operand2); // 操作元2的索引if (idx1 == null || idx2 == null) { // 如果两个操作元有一个找不到res[i] = -1; // 则本此查询返回 -1} else { // 否则查询 value[idx1] / value[idx2] 的结果res[i] = uf.query(idx1, idx2);}}return res;}private UnionFind uf; // 并查集private Map<String, Integer> indexMapper; // 操作元 与 其在并查集中的索引 的映射// 初始化并查集private void init(List<List<String>> equations, double[] values) {int equationsSize = equations.size(); // 获取等式的数量uf = new UnionFind(2 * equationsSize); // 创建一个等式数量二倍大小的并查集indexMapper = new HashMap<>(2 * equationsSize);int idx = 0; // 操作元在并查集中的索引for (int i = 0; i < equationsSize; i++) {// 取出每个等式,建立 操作元 与 其在并查集中的索引 的关系List<String> equation = equations.get(i);String operand1 = equation.get(0); // 操作元1String operand2 = equation.get(1); // 操作元2if (!indexMapper.containsKey(operand1)) { // 如果 索引映射 中不存在 操作元indexMapper.put(operand1, idx++); // 则为其建立映射}if (!indexMapper.containsKey(operand2)) { // 如果 索引映射 中不存在 操作元indexMapper.put(operand2, idx++); // 则为其建立映射}uf.union(indexMapper.get(operand1), indexMapper.get(operand2), values[i]);}}private static class UnionFind {private final int[] parent; // parent[i] 表示 第 i 个元素的父节点private final double[] value; // value[i] 表示 第 i 个元素 / 其父节点 的商// 初始化并查集public UnionFind(int size) {parent = new int[size];value = new double[size];for (int i = 0; i < size; i++) {parent[i] = i; // 初始时,每个元素的父节点都是 自己value[i] = 1; // 初始时,每个元素与自己的商都是 1}}// 查找 x 的根节点,使用了路径压缩public int find(int x) {if (x != parent[x]) { // 如果 x 不是根节点int temp = parent[x]; // 保存 x 的父节点parent[x] = find(parent[x]); // 寻找 x 的根节点value[x] *= value[temp]; // 给 本节点与父节点的商 乘 父节点与父节点的父节点的商}return parent[x]; // 否则返回 parent[x]}// 合并两个节点所在的集合public void union(int x, int y, double value) {int rootX = find(x); // x 的根节点int rootY = find(y); // y 的根节点if (rootX == rootY) {return;}parent[rootX] = rootY; // 让 x 的根节点 指向 y 的根节点,y 的根节点 成为 父节点value[rootX] = value[y] * value / value[x];}// 查询 value[x] / value[y] 的结果public double query(int x, int y) {if (find(x) == find(y)) { // 如果连通return value[x] / value[y]; // 则返回比值} else { // 否则不连通return -1; // 返回 -1}}}
}

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

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

相关文章

GESP CCF 图形化编程四级认证真题 2024年6月

一、单选题&#xff08;共 10 题&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 C B C D C D A B D C C D A A B 1、小…

乌班图下的vscode粘贴代码后一直在输入CTRLV命令

最近在VMware中使用vscode开发c程序中&#xff0c;拷贝一段代码后&#xff0c;代码界面一直输入CTRLV命令&#xff0c;导致乌班图桌面死掉&#xff0c;无法操作、 解决方法&#xff1a; 1、强制重启。长按电源按钮强制关机&#xff0c;然后再次开机。 2、使用命令行界面。同时…

Excel模拟计算演示-以矩阵乘计算密度为例

Excel模拟计算演示-以矩阵乘计算密度为例 1.参考链接2.CUDA_Occupancy_Calculator截图3.矩阵乘计算密度模拟计算的操作步骤及效果 安装好CUDA之后,/usr/local/cuda-12.1/tools/CUDA_Occupancy_Calculator.xls里会看到"TABLE(,B17)"这样的表达式,原来是模拟计算的结果…

深入理解 Java 虚拟机第三版(周志明)

这次社招选的这本作为 JVM 资料查阅&#xff0c;记录一些重点 1. 虚拟机历史 Sun Classic VM &#xff1a;已退休 HotSpot VM&#xff1a;主流虚拟机&#xff0c;热点代码探测技术 Mobile / Embedded VM &#xff1a;移动端、嵌入式使用的虚拟机 2.2 运行时数据区域 程序计…

K210视觉识别模块学习笔记8:Mx_yolo3本地模型训练环境搭建_部署模型到亚博canmv(失败)

今日开始学习K210视觉识别模块: 本地模型训练环境搭建 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 本地训练 Mx_yolo3 这里就简单地提示一下下载安装哪些软件&#xff0c;然后主要是使用Mx_yolo3 进行本地训练模型的...... 本文不…

vite5+vue3开发阅读APP实战笔记20240725

目前界面长成这样&#xff1a; 配置别名 修改vite.config.js import {defineConfig} from vite import vue from vitejs/plugin-vue import path from "path"// https://vitejs.dev/config/ export default defineConfig({server: {open: true,port: 8088,},plug…

IPD推行成功的核心要素(十五)项目管理提升IPD相关项目交付效率和用户体验

研发项目往往包含很多复杂的流程和具体的细节。因此&#xff0c;一套完整且标准的研发项目管理制度和流程对项目的推进至关重要。研发项目管理是成功推动创新和技术发展的关键因素。然而在实际管理中&#xff0c;研发项目管理常常面临着需求不确定、技术风险、人员素质、成本和…

Qt自定义带前后缀图标的PushButton

写在前面 Qt提供QPushButton不满足带前后缀图标的需求&#xff0c;因此考虑自定义实现带前后缀图标的PushButton&#xff0c;方便后续快速使用。 效果如下&#xff1a; 同时可设置前后缀图标和文本之间间隙&#xff1a; 代码实现 通过前文介绍的Qt样式表底层实现 可以得…

DMv8共享存储集群部署

DMv8共享存储集群部署 环境说明 操作系统&#xff1a;centos7.6 服务器&#xff1a;2台虚拟机 达梦数据库版本&#xff1a;达梦V8 安装前准备工作 参考达梦官方文档&#xff1a;https://eco.dameng.com/document/dm/zh-cn/ops/DSC-installation-cluster.html#%E4%B8%80%E3…

深度模型中的优化 - 基本算法篇

序言 在深度学习中&#xff0c;模型优化是提升模型性能与训练效率的关键环节。深度模型通过优化算法不断调整其内部参数&#xff0c;以最小化损失函数&#xff0c;从而实现对复杂数据的有效拟合与预测。本篇章将简要概述深度模型中的几种基本优化算法&#xff0c;包括梯度下降…

I2C framework

/dev/i2cX是i2c总线设备驱动文件。I2C总线是一种字符设备。 先来看驱动drivers/i2c/i2c-core-base.c 驱动drivers/i2c/i2c-core-base.c注册了i2c总线类i2c_bus_type&#xff0c;我们说的i2c0等具体的i2c总线需要注册到这个i2c_bus_type.

传知代码-智慧医疗:纹理特征VS卷积特征(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 论文链接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1076633223003537?__cf_chl_rt_tkJ9Aipfxyk5d.leu48P20ePFNd4B2aunaSmzVpXCg.7g-1721292386-0.0.1.1-6249 论文概述 今天我们把视线…

idea启动项目报:the command line via JAR manifest or via a classpath file and rerun.

解决方案 1.打开Edit Configurations&#xff0c;进去编辑&#xff0c;如下&#xff1a; 笔记配置 2.选择Modfiy options,点击Shorten command line 3.在新增的Shorten command line选项中选择JAR manifest或classpath file 4.点击保存后即可

建立两个基于域名访问的网站

题目 1、配置web服务器&#xff0c;当访问网站www.haha.com时显示&#xff1a;haha 2、配置web服务器&#xff0c;当访问网站www.xixi.com/secret/显示&#xff1a;this is secret 一、 ① # 恢复快照&#xff0c;关闭安全软件 # 安装所需软件 [rootserver ~] # yum install …

mac怎样清理photoshop垃圾的方法 ps清理缓存和垃圾 苹果电脑暂存盘已满怎么清理

很多使用过ps&#xff0c;尤其是Adobe全家桶的小伙伴会发现&#xff0c;这些软件占用缓存很多&#xff0c;而且随着使用时间的增长&#xff0c;缓存也会越多&#xff0c;并不会自动清理。那么mac系统怎么清理ps暂存盘呢&#xff1f;mac又该怎么最高效清理磁盘空间呢&#xff1f…

删除的视频怎样才能恢复?详尽指南

在日常生活中&#xff0c;我们有时会不小心删除一些重要的视频文件&#xff0c;或者在整理存储空间时不慎丢失了珍贵的记忆片段。这时候&#xff0c;我们可以通过一些数据恢复工具和技巧&#xff0c;找回这些被删除的视频。本文将详细介绍几种常见且有效的视频恢复方法&#xf…

【数据结构】顺序表(杨辉三角、简单的洗牌算法)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 欢迎志同道合的朋友一起加油喔 &#x1f4aa;&#x1f4aa;&#x1f4aa; 谢谢你这么帅…

纬创软件赞助 | 两岸曲艺青年汇在台湾会馆举办

7月6日下午&#xff0c;北京台湾会馆处处洋溢着掌声、笑声、欢呼声。由中国曲艺家协会、北京市台联主办&#xff0c;北京国际和平文化基金会、相声天团、吴兆南相声剧艺社、北京德云社文化传播有限公司等协办的“艺道同欢”两岸曲艺青年汇在这里隆重举办。纬创软件赞助了本次活…

生成式人工智能代理 AI Agent:从思维到行动的技术飞跃

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

利用换元法计算积分的常见题型(考研高数复习)

考研中常见的几种换元法积分计算题 (1)被积式仅包含一个根式&#xff1a;根号下为有 a a a 和 x x x 的平方和/平方差 此种类型的积分题型&#xff0c;可以通过构造单个锐角大小为 t t t 的直角三角形&#xff0c;利用勾股定理和三角函数进行代换。 平方和的情况 形如 ∫…