当前位置: 首页 > 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;可能涉及到一些琐碎、复杂的过程…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...