LeetCode 399:除法求值(图的bfs遍历)

题目

给你一个变量对数组 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 = [[“a”,“b”],[“b”,“c”]], values = [2.0,3.0], queries = [[“a”,“c”],[“b”,“a”],[“a”,“e”],[“a”,“a”],[“x”,“x”]]
输出:[6.00000,0.50000,-1.00000,1.00000,-1.00000]
解释:
条件:a / b = 2.0, b / c = 3.0
问题:a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ?
结果:[6.0, 0.5, -1.0, 1.0, -1.0 ]
注意:x 是未定义的 => -1.0
示例 2:

输入:equations = [[“a”,“b”],[“b”,“c”],[“bc”,“cd”]], values = [1.5,2.5,5.0], queries = [[“a”,“c”],[“c”,“b”],[“bc”,“cd”],[“cd”,“bc”]]
输出:[3.75000,0.40000,5.00000,0.20000]
示例 3:

输入:equations = [[“a”,“b”]], values = [0.5], queries = [[“a”,“b”],[“b”,“a”],[“a”,“c”],[“x”,“y”]]
输出:[0.50000,2.00000,-1.00000,-1.00000]

提示:

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 由小写英文字母与数字组成

思路

一个带权值的无向图。就是求给两个节点,看能否在图中由一个节点遍历到另一个节点,可以的话边的权值的乘积就是答案。

代码

class Solution {public class Graph{public HashMap<String,Node> nodes;public HashSet<Edge> edges;public Graph(){nodes = new HashMap<>();edges = new HashSet<>();}}public class Node{public String value;public int in;public int out;public ArrayList<Node> nexts;public ArrayList<Edge> edges;public Node(String value){this.value = value;in = 0;out = 0;nexts = new ArrayList<>();edges = new ArrayList<>();}}public class Edge{public double weight;public Node from;public Node to;public Edge(double weight, Node from, Node to){this.weight = weight;this.from = from;this.to = to;}}public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {ArrayList<Double> ans = new ArrayList<>();//1.构建双向图Graph graph = createGraph(equations,values);// HashMap<String,Node> nodes= graph.nodes;//2.遍历双向图的节点,找是否出现变量for(int i=0;i<queries.size();i++){String startVal = queries.get(i).get(0);String endVal = queries.get(i).get(1);double distance = 0;if(graph.nodes.containsKey(startVal)&&graph.nodes.containsKey(endVal)){Node fromNode = graph.nodes.get(startVal);Node toNode = graph.nodes.get(endVal);HashSet<Node> vis = new HashSet<>();ans.add(bfs(fromNode,toNode,vis));}else{ans.add(-1.0);}}double[] finall = new double[ans.size()];for(int i=0;i<ans.size();i++){finall[i]=ans.get(i);}return finall;}public double bfs(Node fromNode,Node toNode,HashSet<Node> vis){if(fromNode==toNode) return 1.0;vis.add(fromNode);for(Edge nextEdge: fromNode.edges){Node nextNode = nextEdge.to;if(!vis.contains(nextNode)){double distance = nextEdge.weight;double res = bfs(nextNode,toNode,vis);if(res!=-1.0) return distance*res;}}return -1.0;}public Graph createGraph(List<List<String>> equations,double[] values){Graph graph = new Graph();for(int i=0;i<equations.size();i++){String fromVal = equations.get(i).get(0);String toVal = equations.get(i).get(1);if(!graph.nodes.containsKey(fromVal))graph.nodes.put(fromVal, new Node(fromVal));if(!graph.nodes.containsKey(toVal)) graph.nodes.put(toVal, new Node(toVal));Node fromNode = graph.nodes.get(fromVal);Node toNode = graph.nodes.get(toVal);Edge edge = new Edge(values[i], fromNode, toNode);fromNode.out++;toNode.in++;fromNode.nexts.add(toNode);fromNode.edges.add(edge);graph.edges.add(edge);Edge edge1 = new Edge(1/values[i],toNode, fromNode);toNode.out++;fromNode.in++;toNode.nexts.add(fromNode);toNode.edges.add(edge1);graph.edges.add(edge1);}return graph;}}

执行用时分布1ms,击败81.63%使用 Java 的用户。应该不用再优化了

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

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

相关文章

Linux---网络套接字

端口号 端口号 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; IP地址 端口号能够标识网络上的某一台主机的某一个进程; 一个端口号只能被一个进程占用 在公网上&#xff0c;IP地址能表示唯一的一台主机&…

人工智能如何彻底改变身份欺诈

据 AuthenticID 称&#xff0c;近一半的企业报告合成身份欺诈有所增加&#xff0c;而生物识别欺骗和伪造 ID 欺诈尝试也有所增加。 在当今的数字化存在中&#xff0c;消费者和企业都面临着新的挑战&#xff0c;从考虑数字身份的影响到应对生成人工智能等新工具的使用和流行。与…

MySQL进阶查询篇(8)-存储过程的编写与调用

MySQL 是一种开源的关系型数据库管理系统&#xff0c;在开发过程中&#xff0c;我们通常需要编写存储过程来实现复杂的业务逻辑。本文将介绍如何使用 MySQL 编写和调用存储过程。 存储过程的概念和作用 存储过程是一组预编译的 SQL 语句的集合&#xff0c;类似于函数&#xf…

锐捷(二十)DHCP Snooping + IP Source guard + ARP-check防ARP欺骗方案

DHCP Snooping IP Source guard ARP-check防ARP欺骗方案&#xff1a;在用户PC动态获取IP地址的过程中&#xff0c;通过接入层交换机的DHCP Snooping功能将用户DHCP获取到的&#xff0c;正确的IP与MAC信息记录到交换机的DHCP Snooping软件表&#xff1b;然后通过IP Source gua…

【小沐学GIS】基于WebGL绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

【C语言】C的整理记录

前言 该笔记是建立在已经系统学习过C语言的基础上&#xff0c;笔者对C语言的知识和注意事项进行整理记录&#xff0c;便于后期查阅&#xff0c;反复琢磨。C语言是一种面向过程的编程语言。 原想在此阐述一下C语言的作用&#xff0c;然而发觉这些是编程语言所共通的作用&#…

Tdesign 常用知识

Mock数据中的常见随机数&#xff1a; mock 数据中&#xff0c; 开头的是 Mock.js 的语法。Mock.js 是一个用于生成随机数据的库&#xff0c;它提供了一些特殊的语法&#xff0c;可以方便地生成各种类型的随机数据。 在这个 mock 数据中&#xff0c;使用了以下语法&#xff1a…

C语言如何应⽤ gets()函数?

一、问题 输⼊字符串使⽤的是 gets()函数&#xff0c;其作⽤是将读取的字符串保存在形式参数 str 变量中。那么该如何使⽤该函数呢&#xff1f; 二、解答 gets()函数将⼀直读取字符串&#xff0c;直到出现新的⼀⾏为⽌。其中&#xff0c;新的⼀⾏的换⾏字符将会转化为字符串中…

一键打造属于自己漏扫系统

0x01 工具介绍 本系统是对Web中间件和Web框架进行自动化渗透的一个系统,根据扫描选项去自动化收集资产,然后进行POC扫描,POC扫描时会根据指纹选择POC插件去扫描,POC插件扫描用异步方式扫描.前端采用vue技术,后端采用python fastapi。 0x02 安装与使用 1、Docker部署环境 编译…

C语言学习记录

牛牛学说话之-字符_牛客题霸_牛客网 (nowcoder.com) 总结&#xff1a; 字符定义为char,对应%c 整数定义为int&#xff0c;对应%d 分数对应float&#xff0c;对应%f,内存小&#xff0c;速度快 分数对应double,对应%lf&#xff0c;范围广&#xff0c;精度高 保留几位小数就是…

【JAVA WEB】JavaScipt-1

目录 JavaScipt是什么&#xff1f; JavaScipt能做什么&#xff1f; JavaScipt与HTML、CSS之间的关系 JavaScipt运行过程 JavaScipt的组成 JavaScipt的书写方式 1.行内式 2.内嵌式 3.外部式 语法概览 变量的使用 基本用法 动态类型 什么是强类型变量什么是弱类型…

【MySQL】-21 MySQL综合-7(MySQL主键+MySQL外检约束+MySQL唯一约束+MySQL检查约束)

MySQL主键MySQL外检约束MySQL唯一约束MySQL检查约束 MySQL主键选取设置主键约束的字段在创建表时设置主键约束在创建表时设置复合主键在修改表时添加主键约束 MySQL外键约束选取设置 MySQL 外键约束的字段在创建表时设置外键约束在修改表时添加外键约束删除外键约束 MySQL唯一约…

C++入门学习(二十七)跳转语句—break语句

1、与switch语句联合使用 C入门学习&#xff08;二十三&#xff09;选择结构-switch语句-CSDN博客 #include <iostream> #include <string> using namespace std;int main() { int number;cout<<"请为《斗萝大路》打星(1~5※)&#xff1a;" &…

分支解决冲突 分支管理策略 git merge命令详解

git merge详解 git merge 命令用于合并两个分支的更改。以下是 git merge 命令的一些常用参数&#xff1a; git merge <分支名>&#xff1a; 将指定分支的更改合并到当前分支。 git merge feature-branchgit merge --no-ff <分支名>&#xff1a;这个选项确保总是…

Linux操作系统基础(十一):RPM软件包管理器

文章目录 RPM软件包管理器 一、rpm包的卸载 二、rpm包的安装 RPM软件包管理器 rpm&#xff08;英文全拼&#xff1a;redhat package manager&#xff09; 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项软件包的程序&#xff0c;由于它遵循GPL规则且功能强大方便&…

单片机学习笔记---AT24C02(I2C总线)

目录 有关储存器的介绍 存储器的简介 存储器简化模型 AT24C02介绍 AT24C02引脚及应用电路 I2C总线介绍 I2C电路规范 开漏输出模式和弱上拉模式 其中一个设备的内部结构 I2C通信是怎么实现的 I2C时序结构 起始条件和终止条件 发送一个字节 接收一个字节 发送应答…

MySQL优化及索引

MySQL优化一般会从以下几方面进行入手:引擎&#xff08;MySAM、InnoDB等引擎的选择&#xff09;、表设计&#xff08;可以反三范式添加冗余字段提高检索效率&#xff09;、字段的数据类型&#xff08;数值型字段优于字符串字段&#xff09;、sql书写、索引等方面进行优化&#…

虚拟机ens33没有显示ip

1.然后输入命令 cd /etc/sysconfig/network-scripts或&#xff1a; vim /etc/sysconfig/network-scripts/ifcfg-ens33 2.先按 i 开始【编辑】&#xff1b; 3.再用方向键把光标移到ONBOOT这里,把no改成yes&#xff1b; 4.按esc退出编辑模式, 5.按shift: 【输入wq】保…

Stable Diffusion 模型下载:ToonYou(平涂卡通)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 ToonYou 是一个平涂风格的卡通模型&#xff0c;它的画风独特、光感强烈、画面…

c++ STL系列——(四)queue

在C中&#xff0c;标准模板库&#xff08;STL&#xff09;提供了许多容器和算法&#xff0c;其中之一便是queue。queue是一个先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;它允许在队列的末尾添加元素&#xff0c;并从队列的开头移除元素。本文将深入探讨C STL中…