leetcode 399 除法求值

2023-09-22 04:18:51

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

思路

创建一个hashMap<String a,List<String b,value v>> 的数据结构,用来存储 a和b的关系以及他们的除法结果,同时记录b / a 的除法结果 1 / v。

我们的函数最终返回res这个数组,我们把他全部初始化为 -1

接下来我们编写深度搜索函数,这里设置了七个参数,他们的含义分别是

src

起点
dst终点
curVal当前的计算结果
graph
index最初开始的起点的索引
res最终返回结果
visited存储访问过的节点

 我们在递归函数的入口设置curVal为 1,这是因为当这次查询的起点就是终点的时候我们我们的路径计算结果就是1

关于递归函数的出口,当我们的src被访问过时,我们就不再执行函数;当起点等于终点的时候,我们判断一下他们在不在图中,防止有两个不被输入的字符相除,如果他们在图中,记录此时的curVal到res中去,然后终止函数

在递归的过程中,我们要讲curVal 更新为 curVal*nei.div 这是因为nei.str为我们搜索的尾节点,他当前的值curVal是他过去经历的边的乘积。

代码

class Solution {
    public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
        Map<String,List<Cell>> graph = new HashMap<>();

        for(int i = 0;i < values.length;i++){
            String s1 = equations.get(i).get(0),s2 = equations.get(i).get(1);
            graph.computeIfAbsent(s1,k->new ArrayList<>()).add(new Cell(s2,values[i]));
            graph.computeIfAbsent(s2,k->new ArrayList<>()).add(new Cell(s1,1.0 / values[i]));
        }

        double[] res = new double[queries.size()];

        

        Arrays.fill(res,-1.0);

        for(int i = 0;i<queries.size();i++){
            Set<String> visited = new HashSet<>();
            dfs(queries.get(i).get(0),queries.get(i).get(1), 1.0 ,graph,res,i,visited);
        }

        return res;

    }

    public void dfs(String src,String dst,double curVal,Map<String,List<Cell>> graph,double[] res,int index,Set<String> visited){
        if(!visited.add(src)){
            return;
        }
        if(src.equals(dst) && graph.containsKey(src)){
            res[index] = curVal;
            return;
        }
        for(Cell nei:graph.getOrDefault(src,new ArrayList<>())){
            dfs(nei.str,dst,curVal*nei.div,graph,res,index,visited);
        }
    }



}

class Cell{
    String str;
    double div;

    Cell(String str,double div){
        this.str = str;
        this.div = div;
    }
}

更多推荐

【数据结构】二叉树的·深度优先遍历(前中后序遍历)and·广度优先(层序遍历)

💐🌸🌷🍀🌹🌻🌺🍁🍃🍂🌿🍄🍝🍛🍤📃个人主页:阿然成长日记👈点击可跳转📆个人专栏:🔹数据结构与算法🔹C语言进阶🚩不能则学,不知则问,耻于问人,决无长进🍭🍯🍎🍏🍊🍋🍒🍇🍉🍓🍑🍈🍌🍐🍍文章目录一、二叉树的深度优先遍历🌺1.前序遍历(1)`先序遍历`的过程

已解决 IDEA Maven 项目中 “Could not find artifact“ 问题的常见情况和解决方案

🌷🍁博主libin9iOak带您GotoNewWorld.✨🍁🦄个人主页——libin9iOak的博客🎐🐳《面试题大全》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐🪁🍁希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!

如何工作和生活相平衡?

之前待过一家外企,他们的口号是Balancingworkandlife,工作和生活相平衡。辗转几家公司之后,发现这个越来越难了,越来越少的时间投入家庭和自己的生活。人生的意义(AI)人生的意义是一个深奥而复杂的哲学问题,不同的文化、宗教和哲学传统都提供了不同的解释。对于每个人来说,人生的意义也是因人而异的,因为它基于个

企业架构LNMP学习笔记60

Tomcat企业常见使用方法;1)简单代码测试:将两个jsp文件上传到ROOT目录下。查看下这个jsp代码:test.jsp<html><head><title>HelloWorld</title><%@pagelanguage="java"contentType="text/html;charset=UTF-8"pa

半年总结 -要有松弛感的慢生活

匆匆的半年就这样又过去了,菊次郎的夏天也过完了,国庆又要到了,正在发愁国庆节七天要干什么,然后前几天了解省考要提前到1月份,得,这下不就有事情要做了么😏进入正题吧~工作自从去年年末换到新公司,到现在渐渐的适应了这里的工作和同事,尤其是前几个月,感觉像是突破了自己,做了几个自认为比较有挑战性的工作,有些技术,任务之前听

智能配电系统:保障电力运行安全、可控与高效

智能配电系统是一种先进的电力分配技术,它通过智能化、数字化和网络化等方式,有效地保障了电力运行的安全、可控和高效。力安科技智能配电系统是在配电室(含高压柜、变压器、低压柜)、箱式变电站、配电箱及动力柜(箱)、智能终端箱实现智能化、网络化、数字化的基础上,通过移动互联网接入电易云,建设用户智能配电系统服务云管理平台。借助

Mozilla 紧急修补 Firefox 和 Thunderbird 中的 WebP 严重零日漏洞

Mozilla周二发布了安全更新,修复了Firefox和Thunderbird中的一个关键零日漏洞。该漏洞被标记为CVE-2023-4863,是WebP图像格式中的堆缓冲区溢出漏洞,在处理特制图像时可能导致任意代码执行。Mozilla在一份公告中说,打开恶意WebP图像可能导致内容进程中的堆缓冲区溢出,这个漏洞在其他产

AR导览软件定制开发方案

随着智能手机的普及和人们对文化、旅游等方面的需求不断增加,导览软件市场前景广阔。本文将围绕导览软件定制开发方案展开,包括以下部分:一、行业现状及市场需求导览软件市场发展迅速,各类导览软件层出不穷。通过对市场竞争对手的分析,我们发现目前导览软件主要分为两类:1)传统导览软件:以导游解说和景区导览为主,功能相对简单;2)智

魔众题库系统 v8.8.0 公式编辑升级,注册站内信和邮件,手机Banner支持视频背景

魔众题库系统基于PHP开发,可以用于题库管理和试卷生成软件,拥有极简界面和强大的功能,用户遍及全国各行各业。魔众题库系统发布v8.8.0版本,新功能和Bug修复累计23项,公式编辑升级,注册站内信和邮件,手机Banner支持视频背景。2023年09月19日魔众题库系统发布v8.8.0版本,增加了以下23个特性:·[新功

坚鹏:中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期

中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期培训圆满结束中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力,是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市,2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点,服务个人客户超6.5亿户。2022年,在《银行家》(TheBanker

外汇天眼:英国FCA引入新规定,强化金融广告审核标准!

英国金融行为监管局(FCA)为帮助人们做出明智的储蓄、投资和借贷决策,将引入新的筛选检查措施,针对那些批准金融广告的公司。批准非受监管公司的金融营销的公司必须证明他们具备批准广告所需的技能和专业知识。那些签署广告批准的人必须了解产品,以确保广告的宣传准确,并合理平衡风险和回报。以前,受FCA授权的任何公司都可以代表不受

热文推荐