LeetCode399触发求值

题目描述

  给你一个变量对数组 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 替代这个答案。

解析

  这题解法还挺多的,官方题解是基于并查集的方式,视频讲解挺清晰的这里不多赘述。还有解法就是基于图的方法,将图构建好后,图的深度优先遍历或者克鲁斯卡尔算法将邻接矩阵的值更新完毕后直接查询。这题的输入并不多,因此对每一个queries直接DFS即可。
  下面的代码是我一开始看错题目了,我以为只有字母,但是可能会稍微好理解一些。

public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {double[][] distance = new double[26][26];boolean[] defined = new boolean[26];double[] res = new double[queries.size()];Arrays.fill(res, -1.0);for(int i = 0; i < equations.size(); i++) {int first = equations.get(i).get(0).charAt(0) - 97;int second = equations.get(i).get(1).charAt(0) - 97;defined[first] = true;defined[second] = true;distance[first][second] = values[i];distance[second][first] = 1 / values[i];}for(int i = 0; i < queries.size(); i++) {int first = queries.get(i).get(0).charAt(0) - 97;int second = queries.get(i).get(1).charAt(0) - 97;if(defined[first] && defined[second]) {if(distance[first][second] != 0) {res[i] = distance[first][second];continue;}if(first == second) {res[i] = 1;continue;}boolean[] visited = new boolean[26];res[i] = dfs(distance, first, second, visited);}else {res[i] = -1.;}}return res;}public double dfs(double[][] distance, int cur, int target, boolean[] visited) {if(cur == target) {return 1.0;}visited[cur] = true;for(int i = 0; i < 26; i++) {if(!visited[i] && distance[cur][i] != 0) {double res = dfs(distance, i, target, visited);if(res != -1.0) {return distance[cur][i] * res;}}}return -1.;}

  下面才是正确的代码,实际上就是将字母的映射改为使用map去记录字符串和下标的映射。

public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {Map<String, Integer> indexMap = new HashMap<>();int index = 0;for (List<String> equation : equations) {for (String variable : equation) {if (!indexMap.containsKey(variable)) {indexMap.put(variable, index++);}}}double[][] graph = new double[index][index];for (int i = 0; i < index; i++) {Arrays.fill(graph[i], -1.0);graph[i][i] = 1.0; // 每个变量除以自己的结果是1}for (int i = 0; i < equations.size(); i++) {int u = indexMap.get(equations.get(i).get(0));int v = indexMap.get(equations.get(i).get(1));double value = values[i];graph[u][v] = value;graph[v][u] = 1.0 / value;}double[] results = new double[queries.size()];for (int i = 0; i < queries.size(); i++) {Integer u = indexMap.get(queries.get(i).get(0));Integer v = indexMap.get(queries.get(i).get(1));if (u == null || v == null) {results[i] = -1.0;} else {results[i] = dfs(graph, u, v, new boolean[index]);}}return results;}private double dfs(double[][] graph, int cur, int target, boolean[] visited) {if (cur == target) return 1.0;visited[cur] = true;for (int i = 0; i < graph.length; i++) {if (!visited[i] && graph[cur][i] != -1) {double res = dfs(graph, i, target, visited);if (res != -1.0) {return graph[cur][i] * res;}}}return -1.0;}

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

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

相关文章

文科论文,使用AI写作时能够提供实证数据吗?

人工智能时代&#xff0c;为了撰写论文提供思路及高效&#xff0c;利用AI撰写论文已是常态&#xff0c;可撰写文科论文通常研究中都需要实证数据&#xff0c;而AI撰写论文时能够提供这样的数据吗&#xff1f; 一、什么是实证数据 实证数据是指从研究报告、财务报表、新闻报道…

计算机网络——TCP 协议的三次握手 / 四次挥手

简述 TCP / UDP 协议都是传输层的协议。 UDP 是面向无连接的协议&#xff0c;就是说发送端不在乎消息数据是否传输到接收端了&#xff0c;所以会出现数据丢失的情况&#xff0c;所以可靠性也不高。 TCP 是面向连接的、可靠的、基于字节流的传输层协议。所谓面向连接的&#…

Flink-cdc更好的流式数据集成工具

What’s Flink-cdc? Flink CDC 是基于Apache Flink的一种数据变更捕获技术&#xff0c;用于从数据源&#xff08;如数据库&#xff09;中捕获和处理数据的变更事件。CDC技术允许实时地捕获数据库中的增、删、改操作&#xff0c;将这些变更事件转化为流式数据&#xff0c;并能够…

Windows平台C#版RTSP转RTMP直播推送定制版

技术背景 前几年我们发布了C版的多路RTMP/RTSP转RTMP转发官方定制版。在秉承低延迟、灵活稳定、低资源占用的前提下&#xff0c;客户无需关注开发细节&#xff0c;只需图形化配置转发等各类参数&#xff0c;实现产品快速上线目的。 如监控类摄像机、NVR等&#xff0c;通过厂商…

【启程Golang之旅】深入解析函数的奥秘与技巧

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

【全开源】海报在线制作系统源码(ThinkPHP+FastAdmin+UniApp)

打造个性化创意海报的利器 引言 在数字化时代&#xff0c;海报作为一种重要的宣传媒介&#xff0c;其设计质量和效率直接影响着宣传效果。为了满足广大用户对于个性化、高效制作海报的需求&#xff0c;海报在线制作系统源码应运而生。本文将详细介绍海报在线制作系统源码的特…

AbMole - 肿瘤发展与免疫器官的“舞蹈”:一场细胞层面的时间赛跑

在生物医学领域&#xff0c;肿瘤与免疫系统之间的相互作用一直是研究的热点话题。肿瘤细胞不是孤立存在的&#xff0c;它们与宿主的免疫系统进行着一场复杂的“舞蹈”。 最近&#xff0c;一项发表在《Molecular & Cellular Proteomics》杂志上的研究&#xff0c;为我们揭开…

【C++】二分查找算法

1.题目 2.算法思路 暴力解法&#xff1a;可以将数组遍历一遍&#xff0c;就可以找到。时间复杂度为O(n)。不算太差&#xff0c;可以接受。 但是有更优秀的解法&#xff1a; 就是二分查找算法。 算法的特点&#xff1a;我们所查找的“数组”具有二段性。这里的二段性不一定有…

头歌OpenGauss数据库-L.应用开发(Python)-选做

第1关:简单查询 编程要求 正确使用 psycopg2 ,查询金融应用场景数据库 finance 的 client 表(客户表)中邮箱不为空的客户信息,列出客户姓名,邮箱和电话.一个展示结果的示例如下(字体颜色不是编程要求): 注意:你要连接到finance数据库上(后面第2-6关也是连接这个数据库)…

【C/C++】详解关联容器map的使用

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

mpv常用快捷键

1 mpv mpv是Linux下的一个开源视频播放器&#xff0c;使用Manjaro的话安装方式如下&#xff1a; paru -S mpv2 常用快捷键 q&#xff1a;推出w/e&#xff1a;视频缩放r/t&#xff1a;调整字幕位置u&#xff1a;开启/关闭ass/ssa字幕覆盖i&#xff1a;显示当前播放的视频信息…

Oracle 并行和 session 数量的

这也就是为什么我们指定parallel为4&#xff0c;而实际并行度为8的原因。 insert create index&#xff0c;发现并行数都是加倍的 Indexes seem always created with parallel degree 1 during import as seen from a sqlfile. The sql file shows content like: CREATE INDE…

求平方数 1 到 N 之间所有正整数的平方数

概念&#xff1a; 平方数的概念&#xff1a; 平方数是指一个数的平方等于另一个数的数&#xff0c;具有正平方数和负平方数&#xff0c;其性质和运用在多领域中具有重要意义&#xff0c;如几何、自然科学、计算机科学和物理学。平方数的计算和运用在多领域中常见&#xff0c;例…

滑不动窗口的秘密—— “滑动窗口“算法 (Java版)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

《python编程从入门到实践》day39

# 昨日知识点回顾 创建主页、继承模版、显示特定主题页面 # view.py from django.shortcuts import render# 导入所需数据相关联的模型 from .models import Topic# Create your views here. def index(request):"""学习笔记的主页"""#…

Java进阶学习笔记13——抽象类

认识抽象类&#xff1a; 当我们在做子类共性功能抽取的时候&#xff0c;有些方法在父类中并没有具体的体现&#xff0c;这个时候就需要抽象类了。在Java中&#xff0c;一个没有方法体的方法应该定义为抽象方法&#xff0c;而类中如果有抽象方法&#xff0c;该类就定义为抽象类…

ISCC2024个人挑战赛WP-迷失之门

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; 迷失之门 方法一&#xff1a; IDA看一下 check函数逻辑 进入到check2函数 R键将ascii码转字符&#xff0c;写出逆向脚本 #include <stdio.h> #include &l…

嵌入式0基础开始学习 Ⅱ 数据结构(7)小结练习

1,如果使用比较高效的算法判断单链表有没有环的算法中&#xff0c;至少需要几个指针&#xff1f; A,1 B,2 C,3 D,4 2&#xff0c;以链接方式存储的线性表(X1,X2,...,Xn),当访问第i个元素的时间复杂度为? A,o(1) B,o(n) C,o(logn) Do(n) 3,下列链表中&…

Linux C++ Socket 套接字、select、poll、epoll 实例

文章目录 1. 概述2. TCP 网络编程实例2.1 服务器端2.2 客户端2.3 运行截图 3. I/O 模型3.1 阻塞式I/O模型3.2 非阻塞I/O模型3.3 I/O 复用模型3.4 信号驱动式I/O3.5 异步I/O模型 4. I/O复用之 select4.1 select 函数描述4.2 服务端代码4.3 客户端代码4.4 运行截图 5. I/O复用之 …

RocketMq局部顺序消息

package com.ldj.rocketmq.producer;import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message;import java.nio.charset.StandardCharsets;/*** User: ldj* Date: 2024/5/26* Time: 15:09* Description: 局部顺序消…