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

保姆级教程:手把手教你为ESXi 6.7配置主板BIOS(VT-x/VT-d/AES全开)

从零开始&#xff1a;ESXi 6.7主板BIOS设置完全指南当你第一次接触企业级虚拟化平台时&#xff0c;那种既兴奋又忐忑的心情我完全理解。作为过来人&#xff0c;我清楚地记得自己第一次为ESXi配置BIOS时的迷茫——那些专业术语像天书一样&#xff0c;生怕设置错误导致服务器无法…...

XXPermissions:Android权限管理框架的架构设计与最佳实践

XXPermissions&#xff1a;Android权限管理框架的架构设计与最佳实践 【免费下载链接】XXPermissions Android Permissions Framework, Adapt to Android 16 项目地址: https://gitcode.com/GitHub_Trending/xx/XXPermissions 在Android应用开发中&#xff0c;权限管理一…...

Midjourney V6锐化失控?3步诊断+5组--sref/--stylize协同参数公式,立竿见影修复模糊与锯齿

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney V6锐化失控的本质归因 Midjourney V6 引入的全新扩散架构与隐式细节增强机制&#xff0c;导致图像生成过程中高频纹理被过度强化&#xff0c;其根本原因并非参数误配&#xff0c;而是模型在…...

城通网盘直链解析终极指南:3分钟告别广告等待

城通网盘直链解析终极指南&#xff1a;3分钟告别广告等待 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘下载而烦恼吗&#xff1f;每次下载都要面对烦人的广告等待&#xff0c;还要输入…...

一、[特殊字符]️ 误拦噩梦:护栏上线后的真实反弹

一、&#x1f6e1;️ 误拦噩梦&#xff1a;护栏上线后的真实反弹 不少团队在 LLM 推理服务中部署输入护栏后&#xff0c;遇到的第一个生产事故不是攻击漏过&#xff0c;而是正常请求被大规模误拦。某医疗平台上线正则输入过滤后&#xff0c;用户咨询“心绞痛的症状”被拦截&…...

免费岛屿设计终极指南:5分钟快速掌握Happy Island Designer

免费岛屿设计终极指南&#xff1a;5分钟快速掌握Happy Island Designer 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(Animal Cros…...

基于傅里叶神经算子的含时密度泛函理论加速模拟

1. 项目概述与核心思路在计算材料科学和量子化学领域&#xff0c;模拟电子在激光等外场驱动下的动力学行为&#xff0c;是理解光催化、光电转换、甚至量子计算基础过程的关键。含时密度泛函理论&#xff08;TDDFT&#xff09;是处理这类问题的“金标准”之一&#xff0c;它通过…...

如何用WaveTools终极优化鸣潮游戏体验:从帧率解锁到抽卡分析的完整指南

如何用WaveTools终极优化鸣潮游戏体验&#xff1a;从帧率解锁到抽卡分析的完整指南 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 如果你正在玩《鸣潮》却经常遇到帧率不稳定、画面卡顿或者抽卡记录混乱的…...

SSH协议深度解析:从加密隧道到生产级安全加固

1. 这不是“连服务器”的工具&#xff0c;而是现代数字信任的底层地基很多人第一次听说SSH&#xff0c;是在运维同事敲下ssh user192.168.1.100那刻——屏幕一闪&#xff0c;就进了另一台机器的命令行。于是顺理成章把它理解成“远程登录工具”。但这种认知&#xff0c;就像把高…...

UE5面部动画入门:手把手教你用Blender创建Morph Target并导入引擎(附苏珊模型实操)

UE5面部动画实战&#xff1a;从Blender雕刻到引擎驱动的全流程解析在独立游戏开发领域&#xff0c;面部表情动画往往被视为高阶技能&#xff0c;让许多初学者望而却步。但事实上&#xff0c;借助UE5的Morph Target功能和Blender的基础雕刻工具&#xff0c;即使没有任何绑定经验…...