当前位置: 首页 > news >正文

Leetcode 399. 除法求值

  • Leetcode 399. 除法求值
  • 题目
    • 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个
    • Ai 或 Bi 是一个表示单个变量的字符串。
    • 另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。
    • 返回 所有问题的答案 。如果存在某个无法确定的答案,则用 -1.0 替代这个答案。如果问题中出现了给定的已知条件中没有出现的字符串,也需要用 -1.0 替代这个答案。
    • 注意:输入总是有效的。你可以假设除法运算中不会出现除数为 0 的情况,且不存在任何矛盾的结果。
    • 1 <= equations.length <= 20
    • equations[i].length == 2
    • 1 <= Ai.length, Bi.length <= 5
    • values.length == equations.length
    • 0.0 < values[i] <= 20.0
    • 1 <= queries.length <= 20
    • queries[i].length == 2
    • 1 <= Cj.length, Dj.length <= 5
    • Ai, Bi, Cj, Dj 由小写英文字母与数字组成
  • 解法
    • 并查集:将 equations 与 values 的值放入并查集中:parent(equations[i][0])=equations[i][1] 代表 equations[i][0]/equations[i][1],同时设置:parentValue(equations[i][0])=values[i]、parentValue(equations[i][1])=1
    • 并查集必须路径压缩:parent(son)=father 与 parent(father)=grandfather 压缩为:parent(son)=grandfather,新parentValue(son)=旧parentValue(son) * parentValue(father)(=son/father * father/grandfather)
    • 合并两个并查集:son1、son2 需要先路径压缩:ancestor1 = parent(son1),ancestor2 = parent(son2),再合并两个元素的祖先:parent(ancestor1)=ancestor2,然后计算值:parentValue(ancestor1)=value / parentValue(son1) * parentValue(son2) (=son1/son2 / son1/ancestor1 * son2/ancestor2)
    • 循环 queries 分类讨论搜索答案,其实是求出:queries[0]/queries[1],分类讨论:
      • 如果 queries[0] 或 queries[1] 任一元素不再任何并查集中,则返回 -1.0(equations 没有出现过)
      • 如果 queries[0] 或 queries[1] 不再同一个并查集中,则返回 -1.0(相同并查集中元素代表可以通过计算获得比例,不同并查集代表无法产生交集)
      • 否则 计算 parentValue(queries[0])/parentValue(queries[1]) 就是答案((queries[0]/queries[根])/(queries[1]/queries[根]))
    • equations.length(== values.length)为 n、queries.length 为 m,equations 里不同字符的个数为 x,时间复杂度:O((n+m)*α(x)),空间复杂度:O(x)
  • 代码
    /*** 并查集:将 equations 与 values 的值放入并查集中:parent(equations[i][0])=equations[i][1] 代表 equations[i][0]/equations[i][1],* 同时设置:parentValue(equations[i][0])=values[i]、parentValue(equations[i][1])=1* 并查集必须路径压缩:parent(son)=father 与 parent(father)=grandfather 压缩为:parent(son)=grandfather* 新parentValue(son)=旧parentValue(son) * parentValue(father)(=son/father * father/grandfather)* 合并两个并查集:son1、son2 需要先路径压缩:ancestor1 = parent(son1),ancestor2 = parent(son2),* 再合并两个元素的祖先:parent(ancestor1)=ancestor2,然后计算值:parentValue(ancestor1)=value / parentValue(son1) * parentValue(son2)* (=son1/son2 / son1/ancestor1 * son2/ancestor2)* 循环 queries 分类讨论搜索答案,其实是求出:queries[0]/queries[1],分类讨论:*     如果 queries[0] 或 queries[1] 任一元素不再任何并查集中,则返回 -1.0(equations 没有出现过)*     如果 queries[0] 或 queries[1] 不再同一个并查集中,则返回 -1.0(相同并查集中元素代表可以通过计算获得比例,不同并查集代表无法产生交集)*     否则 计算 parentValue(queries[0])/parentValue(queries[1]) 就是答案((queries[0]/queries[根])/(queries[1]/queries[根]))* equations.length(== values.length)为 n、queries.length 为 m,equations 里不同字符的个数为 x,时间复杂度:O((n+m)*α(x)),空间复杂度:O(x)*/public double[] solution(List<List<String>> equations, double[] values, List<List<String>> queries) {// 判空if (equations == null || values == null || queries == null || equations.size() != values.length) {return new double[0];}// 将 equations 与 values 的值放入并查集中int len = values.length;Map<String, String> parent = new HashMap<>((len / 3) << 2);Map<String, Double> parentValue = new HashMap<>((len / 3) << 2);for (int i = 0; i < len; i++) {// equations 新参数初始化:指向自己,值为 1.0initEquations(equations.get(i).get(0), parent, parentValue);initEquations(equations.get(i).get(1), parent, parentValue);union(equations.get(i).get(0), equations.get(i).get(1), parent, values[i], parentValue);// System.out.println(parent);// System.out.println(parentValue);}// 循环 queries 分类讨论搜索答案,其实是求出:queries[0]/queries[1],分类讨论double[] answer = new double[queries.size()];int index = 0;for (List<String> queriesSingle : queries) {answer[index] = getAnswerByUnionFind(parent, queriesSingle.get(0), queriesSingle.get(1), parentValue);index++;}return answer;}private void initEquations(String factor, Map<String,String> parent, Map<String,Double> parentValue) {if (!parent.containsKey(factor)) {parent.put(factor, factor);parentValue.put(factor, 1.0);}}private void union(String son, String father, Map<String,String> parent, double value, Map<String, Double> parentValue) {String sonAncestor = find(son, parent, parentValue);String fatherAncestor = find(father, parent, parentValue);parent.put(sonAncestor, fatherAncestor);parentValue.put(sonAncestor, value / parentValue.get(son) * parentValue.get(father));}private String find(String factor, Map<String,String> parent, Map<String, Double> parentValue) {if (!parent.containsKey(factor)) {return null;}if (factor.equals(parent.get(factor))) {return factor;}String ancestor = find(parent.get(factor), parent, parentValue);// 路径压缩parentValue.put(factor, parentValue.get(factor) * parentValue.get(parent.get(factor)));parent.put(factor, ancestor);return ancestor;}private double getAnswerByUnionFind(Map<String,String> parent, String q0, String q1, Map<String, Double> parentValue) {if (q0 == null || q1 == null) {return -1.0;} else if (find(q0, parent, parentValue) == null || find(q1, parent, parentValue) == null) {return -1.0;} else if (!find(q0, parent, parentValue).equals(find(q1, parent, parentValue))) {return -1.0;} else {return parentValue.get(q0)/parentValue.get(q1);}}

相关文章:

Leetcode 399. 除法求值

Leetcode 399. 除法求值题目 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个Ai 或 Bi 是一个表示单个变量的字符串。另有一些以数组 queries 表示的问题&am…...

kotlin协程并发/并行与串行互相切换,CoroutineScope与await

kotlin协程并发/并行与串行互相切换&#xff0c;CoroutineScope与await import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.time.LocalTimefun main(args: Arra…...

初识linux之简单了解TCP协议与UDP协议

目录 一、理解源IP地址和目的IP地址 二、端口号 1. 为什么要有端口号 2. 理解端口号 3. 源端口号和目的端口号 三、初步了解TCP协议和UDP协议 1. 初步认识TCP协议 2. 初步认识UDP协议 3. 可靠传输与不可靠传输 四、网络字节序 1. 网络字节序的概念 2. 如何形成网络…...

【String——简单使用】

文章目录 String1. 字符串定义和初始化2. 字符串基本操作2.1 访问单个字符2.2 修改字符串内容2.3 字符串查找和比较 3. 常用字符串函数3.1 length() 和 size()3.2 empty()3.3 substr()3.4 c_str() 4.字符与整形之间相互转换4.1 char 类型转 int 类型4.2 int 类型转 char 类型4.…...

Python下Taobao封装API接口的优势

Python是一门面向对象编程的语言&#xff0c;封装是面向对象编程中的一种重要概念&#xff0c;它把数据和方法包装在一起&#xff0c;实现了对数据的保护和控制。Python封装接口的优势如下&#xff1a; 1.安全性 封装可以保证数据的安全性&#xff0c;禁止外部对数据的直接访…...

LeetCode 49 字母异位词分组

LeetCode 49 字母异位词分组 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/group-anagrams/description/ 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给你一个字符串数组&#x…...

( 链表) 142. 环形链表 II——【Leetcode每日一题】

❓142. 环形链表 II 难度&#xff1a;中等 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定…...

论文解读 | 基于改进点对特征的点云6D姿态估计

原创 | 文 BFT机器人 01 摘要 点对特征(PPF)方法已被证明是一种有效的杂波和遮挡下的姿态估计方法。 文章的改进方法主要包括: (1)一种基于奇偶规则求解封闭几何的法向的方法; (2)通过将体素网格划分为等效角度单元的有效降采样方法; (3)基于拟合点的验证步骤。在真实杂波数据集…...

Shell脚本while循环语句应用

记录&#xff1a;433 场景&#xff1a;Shell脚本while循环语句应用。Shell脚本while循环语句应用。while do done、while : do done、while true do done。 版本&#xff1a;CentOS Linux release 7.9.2009。 1.while常用格式 1.1格式一&#xff1a;while do done while c…...

Kubernetes Dashboard + Ingress 及其 yaml 文件分析

概述 记录部署Dashboard Ingress的具体过程及其 yaml 文件分析 Dashboard Yaml # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the Li…...

【SpringCloud组件——Nacos】

前置准备&#xff1a; 分别提供订单系统&#xff08;OrderService&#xff09;和用户系统&#xff08;UserService&#xff09;。订单系统主要负责订单相关信息的处理&#xff0c;用户系统主要负责用户相关信息的处理。 一、服务注册与发现 1.1、在父工程当中引入Nacos依赖 …...

pinia状态管理 用法

Pinia是一个用于vue的状态管理库&#xff0c;类似于vuex,是vue的另一种状态管理工具。 Pinia 是 Vue 的存储库&#xff0c;它允许跨组件/页面共享状态。实际上&#xff0c;Pinia就是Vuex的升级版&#xff0c;官网也说过&#xff0c;为了尊重原作者&#xff0c;所以取名pinia&am…...

Oracle客户端版本安装

一、版本准备 Oracle版本下载官网&#xff1a;Instant Client for Linux x86-64 (64-bit) | Oracle 中国 进入网站下载对应的oracle版本&#xff0c;通常环境所用的包有&#xff1a;basic、sdk、sdkplus三个包。包的类型分为rpm和zip包&#xff0c;均可以下载&#xff0c;当前…...

基于Android studio二手车交易系统app

客户端&#xff1a; 用户注册&#xff1a;通过输入用户名&#xff0c;密码&#xff0c;所在地&#xff0c;联系地址以及电话和电子邮件等信息进行用户信息的注册。 二手车查看&#xff1a;用户注册登录系统后&#xff0c;可以查看二手车的基本信息&#xff0c;通过二手车的品牌…...

【LCD应用编程】绘制点、线、矩形框

之前获取LCD屏幕参数信息时了解到&#xff0c;LCD屏是 FrameBuffer 设备&#xff0c;操作 FrameBuffer 设备 其实就是在读写 /dev/fb0 文件。除此之外&#xff0c;LCD屏上包含多个像素点&#xff0c;绘制点、线、矩形框本质是在修改这些像素点的颜色。 目录 1、定义 lcd_color…...

第八篇、基于Arduino uno,获取MAX30102心率传感器的心率信息——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;第一个值是原始的IR值&#xff0c;第二个值是实时的心跳&#xff0c;第三个值是平均心跳&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;MAX30102心率传感器的外观如下…...

【MySQL】MySQL主从同步延迟原因与解决方案

文章目录 一、MySQL数据库主从同步延迟产生的原因二、关于DDL和DML三、主从延时排查方法四、解决方案3.1 解决从库复制延迟的问题&#xff1a;3.2 MySql数据库从库同步其他问题及解决方案 一、MySQL数据库主从同步延迟产生的原因 MySQL的主从复制都是单线程的操作&#xff0c;…...

学C的第二十二天【深度剖析数据在内存中的存储:1. 数据类型介绍;2. 整型在内存中的存储】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a;学C的第二十一天【初阶测评讲解&#xff1a;1. 计算递归了几次&#xff1b;2. 判断 do while 循环执行了几次&#xff1b;3. 求输入的两个数的最小公倍数&#xff1b;4. 将一句话的单词进…...

测试计划模板一

测试计划 修订历史记录 版本        日期       AMD       修订者      说明      1.0 XXXX年XX月XX (A-添加,M-修改,D-删除) 目录 1. 简介.. 4 1. 1目的... 4 1. 2背景... 4...

【利用AI让知识体系化】5种创建型模式

文章目录 创建型模式简介工厂模式抽象工厂模式单例模式建造者模式原型模式 创建型模式 简介 创建型模式&#xff0c;顾名思义&#xff0c;是用来创建对象的模式。在软件开发中&#xff0c;对象的创建往往比一般的编程任务更为复杂&#xff0c;可能涉及到一些琐碎、复杂的过程…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...