问题简介

给定一些由变量组成的等式组,然后根据这些等式推算出所闻的等式的结果,如果无法推算,则返回-1.0。
比如:

给定等式组
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 ]

注:给定的等式组不存在结果为0的情况。

解题思路

先构造一个数据结构,然后根据给定的等式构造一个map,便于访问,这其实就相当与是一幅稀疏图。
要注意的是,这里在保存a/b=2.0 a/b=2.0 这样的等式时,同时也保存了b/a=0.5 b/a=0.5 。

// 构造一个结构体
struct 节点{是否访问过;unordered_map<除数, 结果>;
};// 构造稀疏图
unordered_map<变量, 节点>;

然后根据询问的内容做深度优先遍历即可。

源代码

struct Node{bool visited;unordered_map<string, double> children;Node(){visited = false;}
};class Solution {
private:vector<double> res;private:bool dfs(unordered_map<string, Node*>& mp, pair<string, string>& p, double r){if (mp.find(p.first) != mp.end() && !mp[p.first]->visited){mp[p.first]->visited = true;if (mp[p.first]->children.find(p.second) != mp[p.first]->children.end()){res.push_back(r * mp[p.first]->children[p.second]);mp[p.first]->visited = false;return true;}else{for (auto iter = mp[p.first]->children.begin(); iter != mp[p.first]->children.end(); iter++){pair<string, string> new_p = make_pair(iter->first, p.second);if (dfs(mp, new_p, r * iter->second)){mp[p.first]->visited = false;return true;}}}mp[p.first]->visited = false;}return false;}public:vector<double> calcEquation(vector<pair<string, string>> equations, vector<double>& values, vector<pair<string, string>> queries) {// 构造图unordered_map<string, Node*> mp;for (int i = 0; i < equations.size(); i++){// 保存a/bif (mp.find(equations[i].first) == mp.end()){mp[equations[i].first] = new Node();}Node* tmp = mp[equations[i].first];if (tmp->children.find(equations[i].second) == tmp->children.end()){tmp->children[equations[i].second] = values[i];}// 保存b/aif (mp.find(equations[i].second) == mp.end()){mp[equations[i].second] = new Node();}tmp = mp[equations[i].second];if (tmp->children.find(equations[i].first) == tmp->children.end()){tmp->children[equations[i].first] = 1.0 / values[i];}}// 开始执行queryfor (int i = 0; i < queries.size(); i++){if (queries[i].first == queries[i].second){if (mp.find(queries[i].first) != mp.end())res.push_back(1.0);elseres.push_back(-1.0);}else{if (!dfs(mp, queries[i], 1.0)){res.push_back(-1.0);}}}return res;}
};

利用哈希表和dfs解决LeetCode 399. Evaluate Division相关推荐

  1. leetcode 399. Evaluate Division | 399. 除法求值(图的邻接表,DFS)

    题目 https://leetcode.com/problems/evaluate-division/ 题解 题目看着复杂,实际上是图的 DFS. 例如,已知 a/b, b/c, c/d,想求 a/d ...

  2. C++哈希表最详细解决

    目录 1 哈希表理论基础 1. 1 哈希函数 1.2 哈希碰撞 2 哈希表力扣题参考代码 原文链接  代码随想录 1 哈希表理论基础 首先什么是 哈希表,哈希表(英文名字为Hash table,国内也 ...

  3. PowerCLI脚本,利用哈希表对参数进行转换

    在使用PowerCLI的编写powershell脚本的过程中,有这样一个需求:例如需要重启一个指定的虚拟机,运行脚本时输入的参数,参数为虚拟机的名字,但是虚拟机的名字在建立的时候可能是千奇百怪,我们想 ...

  4. <力扣>-----利用哈希表来判断是否存在重复元素

    class Solution {public boolean containsDuplicate(int[] nums) {Set<Integer> set = new HashSet&l ...

  5. LeetCode 399. Evaluate Division--Python-DFS解法

    题目地址:Evaluate Division - LeetCode Equations are given in the format A / B = k, where A and B are var ...

  6. 利用BFS和DFS解决 LeetCode 130: Surrounded Regions

    问题来源 此题来源于LEETCODE,具体问题详见下面的链接 https://leetcode.com/problems/surrounded-regions/description/ 问题简述 给定 ...

  7. 利用bds和dfs解决 LeetCode 107. Binary Tree Level Order Traversal II

    问题简述 给定一棵二叉树,返回该二叉树自底向上遍历的结点值(即从左到右,自底向上) 比如给定一颗二叉树 [3,9,20,null,null,15,7] 3/ \ 9 20/ \ 15 7 返回的结果为 ...

  8. ⭐算法入门⭐《哈希表》中等05 —— LeetCode 215. 数组中的第K个最大元素

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给定整数数组nums和 ...

  9. python leetcode_七十五、Python | Leetcode哈希表系列

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

最新文章

  1. linux 远程控制权限,总结一下linux远程控制方法
  2. 16、IN和NOT IN用法详解
  3. 关于eclipse的indigo版中文注释时字体太小的问题(转)
  4. cls certificate.php,php加密解密处理类
  5. 【白皮书分享】2020中国人工智能API经济白皮书.pdf(附下载链接)
  6. python 计算机程序设计-计算机编程语言中,为何Python独得恩宠?
  7. 【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)
  8. php ext在哪里,PHP Ext API
  9. python文件数据类型_Python核心数据类型-文件
  10. 51单片机无法烧录程序的N种解决办法
  11. java编程语言怎么学习,详细说明
  12. 10019---Linux查看CPU、内存、硬盘、版本信息
  13. 使用Clang作为编译器 —— 使用 Clang 交叉编译
  14. 解决Win10搜索框不能使用
  15. 在LINUX如何用键盘复制,粘贴
  16. java实现蒲丰投针求_蒲丰投针问题
  17. 元宇宙大热,DiDi message将成为未来世界的连接器
  18. 谷歌翻译 无法翻译此网页解决方案
  19. Android开发之--从app中跳转到淘宝店铺
  20. 基于AI的4G/5G基站节能的智能解决方案

热门文章

  1. java 加锁_Java并发之synchronized深入
  2. 爬虫数据executemany插入_金融数据的获取——一个爬虫的简单例子
  3. android 编译luajit,Android 嵌入 LuaJIT 的曲折道路
  4. 智能外呼系统相关资料总结
  5. 08_JS工厂方法和构造函数
  6. 不属于python数据类型的是_Python不支持的数据类型有( )。
  7. pointcut 切面表达式 切入点表达式
  8. devexpress gridcontrol 内置导航栏,双击后才修改数据
  9. 多线程篇-NSThread-简单使用
  10. 设计模式——简单工厂