Leetcode 面试150题 399.除法求值

系列博客目录


文章目录

  • 系列博客目录
  • 题目
  • 思路
  • 代码


题目

链接
在这里插入图片描述

思路

广度优先搜索

我们可以将整个问题建模成一张图:给定图中的一些点(点即变量),以及某些边的权值(权值即两个变量的比值),试对任意两点(两个变量)求出其路径长(两个变量的比值)。

因此,我们首先需要遍历 equations 数组,找出其中所有不同的字符串(作为图的点),并通过哈希表将每个不同的字符串映射成整数(方便在代码中进行表示)。

在构建完图之后,对于任何一个查询,就可以从起点出发,通过广度优先搜索的方式,不断更新起点与当前点之间的路径长度,直到搜索到终点为止。比如已知a/b和b/c,我们要求a/c,其实就是找到点a,通过广度优先找到b(通过线段X,其值为a/b),再从b找到c(通过线段Y,其值为(a/b)*(b/c))。

代码

class Solution {public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {int nvars = 0;//后面通过nvars不断增加,为字符串变量赋值不同的数字。//变量存到HashMap中,实现字符串变量与数字一一对应。Map<String, Integer> variables = new HashMap<String, Integer>();//找到所有变量,为其指定唯一一个数字,nvars的值变成了变量的数量int n = equations.size();for (int i = 0; i < n; i++) {if (!variables.containsKey(equations.get(i).get(0))) {variables.put(equations.get(i).get(0), nvars++);}if (!variables.containsKey(equations.get(i).get(1))) {variables.put(equations.get(i).get(1), nvars++);}}// 对于每个点,存储其直接连接到的所有点及对应的权值List<Pair>[] edges = new List[nvars];for (int i = 0; i < nvars; i++) {edges[i] = new ArrayList<Pair>();//为每个变量初始化一个链表,链表存放Pair类型的值}//为每个变量赋值 把与其有关联的变量以及与所关联变量所一一对应的值放入链表for (int i = 0; i < n; i++) {int va = variables.get(equations.get(i).get(0)), vb = variables.get(equations.get(i).get(1));edges[va].add(new Pair(vb, values[i]));edges[vb].add(new Pair(va, 1.0 / values[i]));}int queriesCount = queries.size();double[] ret = new double[queriesCount];//存储最后结果for (int i = 0; i < queriesCount; i++) {List<String> query = queries.get(i);//取出一个查询,这个查询包含两部分,两个字符串,我们需要求前字符串除后字符串的值。double result = -1.0;//如果之后发现之前存储所有变量的map中没有构成这个查询的两个字符串中的任意一个,直接返回 -1.0,即查询不到结果。if (variables.containsKey(query.get(0)) && variables.containsKey(query.get(1))) {//找到构成查询的两个字符串所变量对应的数字int ia = variables.get(query.get(0)), ib = variables.get(query.get(1));if (ia == ib) {result = 1.0;} else {//开始广度优先遍历Queue<Integer> points = new LinkedList<Integer>();points.offer(ia);double[] ratios = new double[nvars];//用来标记查询中第一个字符串变量到达他所能够到达的所有变量后,即其除以这个变量的比值(即可以得到以ia为分子的比值的所有结果),最后只取出我们需要的那个变量所在位置的值作为答案。Arrays.fill(ratios, -1.0);ratios[ia] = 1.0;//标记自己到自己,且比值为 1 while (!points.isEmpty() && ratios[ib] < 0) {int x = points.poll();for (Pair pair : edges[x]) {int y = pair.index;double val = pair.value;if (ratios[y] < 0) {//判断是否遍历过,避免产生环。ratios[y] = ratios[x] * val;points.offer(y);}}}result = ratios[ib];//取出本次查询的答案}}ret[i] = result;}return ret;}
}class Pair {int index;double value;Pair(int index, double value) {this.index = index;this.value = value;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/evaluate-division/solutions/548585/chu-fa-qiu-zhi-by-leetcode-solution-8nxb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:力扣官方题解
链接:https://leetcode.cn/problems/evaluate-division/solutions/548585/chu-fa-qiu-zhi-by-leetcode-solution-8nxb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

Python机器视觉的学习

一、二值化 1.1 二值化图 二值化图&#xff1a;就是将图像中的像素改成只有两种值&#xff0c;其操作的图像必须是灰度图。 1.2 阈值法 阈值法&#xff08;Thresholding&#xff09;是一种图像分割技术&#xff0c;旨在根据像素的灰度值或颜色值将图像分成不同的区域。该方法…

Linux 支持多个spi-nor flash

1. 需求 通常在嵌入式开发过程中可能会遇到需要再同一个SPI总线上挂载多个spi nor flash才能满足存储需求。 2. 技术简介 对于spi-nor flash驱动通常不需要驱动开发人员手搓&#xff0c;一般内核会有一套固定的驱动&#xff0c;而且走的是内核的MTD子系统那一套&#xff0c;市…

超标量处理器设计笔记(11)发射内容:分配、仲裁、唤醒

发射 概述集中式和分布式数据捕捉和非数据捕捉数据捕捉非数据捕捉总结对比 压缩式和非压缩式压缩式发射队列非压缩式发射队列总结 发射过程的流水线非数据捕捉结构的流水线数据捕捉结构的流水线 分配仲裁1-of-M 的仲裁电路N of M 的仲裁电路 唤醒单周期指令的唤醒多周期指令的…

ArrayList源码分析、扩容机制面试题,数组和List的相互转换,ArrayList与LinkedList的区别

目录 1.java集合框架体系 2. 前置知识-数组 2.1 数组 2.1.1 定义&#xff1a; 2.1.2 数组如何获取其他元素的地址值&#xff1f;&#xff08;寻址公式&#xff09; 2.1.3 为什么数组索引从0开始呢&#xff1f;从1开始不行吗&#xff1f; 3. ArrayList 3.1 ArrayList和和…

地下管线三维建模,市面上有哪些软件

1. 地下管线&#xff1a;城市“生命线” 地下管线是城市的重要基础设施&#xff0c;包括供水、排水、燃气、热力、电力、通信等管线&#xff0c;它们如同城市的“生命线”&#xff0c;支撑着城市的正常运转。如果缺乏完整和准确的地下管线信息&#xff0c;施工破坏地下管线的事…

蓝桥杯刷题——day5

蓝桥杯刷题——day5 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 给定n个整数 a1,a2,⋯ ,an&#xff0c;求它们两两相乘再相加的和&#xff0c;即&#xff1a; 示例一&#xff1a; 输入&#xff1a; 4 1 3 6 9 输出&#xff1a; 117 题目链…

L1-3流量分析

1. 初步分析 数据包下载 流量分析基础篇 使用科来网络分析系统&#xff0c;打开L1-3.pcapng数据包&#xff0c;查看数据包中ssh的协议占的比例较大。 2. 通过分析数据包L1-3&#xff0c;找出黑客的IP地址&#xff0c;并将黑客的IP地址作为FLAG(形式:[IP地址)提交; 获取的fl…

docker启动一个helloworld(公司内网服务器)

这里写目录标题 容易遇到的问题&#xff1a;1、docker连接问题 我来介绍几种启动 Docker Hello World 的方法&#xff1a; 最简单的方式&#xff1a; docker run hello-world这会自动下载并运行官方的 hello-world 镜像。 使用 Nginx 作为 Hello World&#xff1a; docker…

【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析

【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析 在裸聊敲诈、虚假理财诈骗案件类型中&#xff0c;犯罪分子为了能实现更低成本、更快部署应用的目的&#xff0c;其服务器架构多为常见的初始化网站架构&#xff0c;也称为站库同体服务器&#xff01;也就是说网站应用…

图像处理 - 车道线检测:智能驾驶的“眼睛”

引言 在智能驾驶技术飞速发展的今天&#xff0c;车道线检测作为一项基础而关键的技术&#xff0c;扮演着车辆“眼睛”的角色。它不仅关系到车辆的导航和定位&#xff0c;还直接影响到自动驾驶系统的安全性和可靠性。本文将带你深入了解车道线检测技术的原理、方法以及在实际应用…

【Linux学习】十五、Linux/CentOS 7 用户和组管理

Linux下组和用户的管理都必须是root用户下进行&#xff1a; 一、组的管理 1.组的创建 格式&#xff1a; groupadd 组名参数&#xff1a; -g&#xff1a;指定用户组的组ID&#xff08;GID&#xff09;&#xff0c;如果不提供则由系统自动分配。 【案例】创建一个名为 oldg…

Unity类银河战士恶魔城学习总结(P179 Enemy Archer 弓箭手)

教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了敌人弓箭手的制作 Enemy_Archer.cs 核心功能 状态机管理敌人的行为 定义了多个状态对象&#xff08;如 idleState、moveState、attackState 等&#xff09;&#xff0c;通过状态机管理敌人的…

Pikachu靶场——XXE漏洞

XXE&#xff08;XML External Entity&#xff09;漏洞 XXE&#xff08;XML External Entity&#xff09;漏洞是一种常见的安全漏洞&#xff0c;发生在处理 XML 数据的应用程序中。当应用程序解析 XML 输入时&#xff0c;如果没有正确配置或过滤外部实体的加载&#xff0c;就可能…

使用 ESP-IDF 进行esp32-c3开发第四步:VSCode里安装ESP-IDF插件

很多小伙伴还是习惯在VSCode里写代码&#xff0c;所以今天进行了--使用 ESP-IDF 进行esp32-c3开发第四步&#xff1a;VSCode里安装ESP-IDF插件 安装和配置 首先到VSCode的插件页面&#xff0c;搜索esp&#xff0c;排名第一的就是ESP-IDF插件&#xff0c;点击安装即可。 在命令…

SSM 垃圾分类系统——高效分类的科技保障

第五章 系统功能实现 5.1管理员登录 管理员登录&#xff0c;通过填写用户名、密码、角色等信息&#xff0c;输入完成后选择登录即可进入垃圾分类系统&#xff0c;如图5-1所示。 图5-1管理员登录界面图 5.2管理员功能实现 5.2.1 用户管理 管理员对用户管理进行填写账号、姓名、…

部署GitLab服务器

文章目录 环境准备GitLab部署GitLab服务器GitLab中主要的概念客户端上传代码到gitlab服务器CI-CD概述软件程序上线流程安装Jenkins服务器 配置jenkins软件版本管理配置jenkins访问gitlab远程仓库下载到子目录部署代码到web服务器自动化部署流程 配置共享服务器配置jenkins把git…

泷羽sec学习打卡-brupsuite8伪造IP和爬虫审计

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-Brup-FaskIP 伪造IP配置环境brupsuite导入配置1、扩展中先配置python环境2、安…

如何在 Ubuntu 22.04 上使用 Fail2Ban 保护 SSH

前言 SSH&#xff0c;这玩意儿&#xff0c;简直是连接云服务器的标配。它不仅好用&#xff0c;还很灵活。新的加密技术出来&#xff0c;它也能跟着升级&#xff0c;保证核心协议的安全。但是&#xff0c;再牛的协议和软件&#xff0c;也都有可能被攻破。SSH 在网上用得这么广&…

智能家居WTR096-16S录放音芯片方案,实现语音播报提示及录音留言功能

前言&#xff1a; 在当今社会的高速运转之下&#xff0c;夜幕低垂之时&#xff0c;许多辛勤工作的父母尚未归家。对于肩负家庭责任的他们而言&#xff0c;确保孩童按时用餐与居家安全成为心头大事。此时&#xff0c;家居留言录音提示功能应运而生&#xff0c;恰似家中的一位无形…

EasyGBS国标GB28181-2016标准解读:基于TCP协议的视音频媒体传输

在探讨EasyGBS平台基于GB28181-2016标准的TCP协议视音频媒体传输时&#xff0c;我们首先需要了解GB28181标准的基本背景。GB28181&#xff0c;即GB/T28181—2016《公共安全视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是公安部提出的公共安全行业标准&#xff…