399. 除法求值

给出方程式 A / B = k, 其中 A 和 B 均为代表字符串的变量, k 是一个浮点型数字。根据已知方程式求解问题,并返回计算结果。如果结果不存在,则返回 -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 ]

输入为: vector<pair<string, string>> equations, vector& values, vector<pair<string, string>> queries(方程式,方程式结果,问题方程式), 其中 equations.size() == values.size(),即方程式的长度与方程式结果长度相等(程式与结果一一对应),并且结果值均为正数。以上为方程式的描述。 返回vector类型。

基于上述例子,输入如下:

equations(方程式) = [ [“a”, “b”], [“b”, “c”] ],

values(方程式结果) = [2.0, 3.0],

queries(问题方程式) = [ [“a”, “c”], [“b”, “a”], [“a”, “e”], [“a”, “a”], [“x”, “x”] ].

输入总是有效的。你可以假设除法运算中不会出现除数为0的情况,且不存在任何矛盾的结果。

PS:

用map构建关系,然后dfs找

class Solution {
public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
Map<String, Map<String,Double>> graph = doGraph(equations, values);
double[] res = new double[queries.size()];
int index = 0;
for(List<String> q : queries){
res[index++] = dfs(graph, new HashSet<>(), q.get(0), q.get(1), 1);
}
return res;
} public double dfs(Map<String, Map<String,Double>> graph, Set<String> visited, String start, String end, double ans){
if(!graph.containsKey(start) || !graph.containsKey(end)) return -1;
Map<String, Double> edges = graph.get(start);
for(String key : edges.keySet()){
if(!visited.contains(key)){
visited.add(key);
double v = edges.get(key);
if(key.equals(end)) return ans*v; //
double d = dfs(graph, visited, key, end, ans*v);
if(d != -1) return d;
}
}
return -1;
} public Map<String, Map<String,Double>> doGraph(List<List<String>> equations, double[] values){
Map<String, Map<String,Double>> graph = new HashMap<>();
for(int i = 0 ; i < equations.size(); i++){
String s = equations.get(i).get(0);
String t = equations.get(i).get(1);
double val = values[i];
Map<String, Double> edge1 = graph.getOrDefault(s, new HashMap<>());
edge1.put(t, val);
graph.put(s, edge1);
Map<String, Double> edge2 = graph.getOrDefault(t, new HashMap<>());
edge2.put(s, 1/val);
graph.put(t, edge2);
}
return graph;
} }

最新文章

  1. 25 highest paying companies: Which tech co outranks Google, Facebook and Microsoft?
  2. salesforce 零基础学习(二十二)Test简单使用
  3. 【leetcode】Reverse Bits(middle)
  4. Codeforces #Round 376 部分题解
  5. Css Study - Top Menu in Header 横向间隔的菜单
  6. xcode 最近打开文件列表显示为空或不显示最近打开的项目或(no recent projects)解决办法
  7. 求a,b在区间上的公倍数个数
  8. oracle使用口令文件验证和os验证
  9. java WEB Response重定向和缓存控制
  10. NET Platform Standard
  11. 查看linux版本相关命令
  12. OpenCV设置摄像头分辨率及全屏显示
  13. 对unicode数据进行部分replace
  14. 创建Java多线程的两种方式和线程异常
  15. @ControllerAdvice + @ExceptionHandler 使用
  16. [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)
  17. python开发环境搭建(windows+python2.7.5+django1.5.4)【原创】
  18. SpingMVC_注解式开发_接收请求参数
  19. 仅100行的JavaScript DOM操作类库
  20. linux记录每个用户执行的命令

热门文章

  1. Leetcode_45. 跳跃游戏 II
  2. python入门及数字、字符串类型
  3. .net core 3.1 在iis上的发布(踩坑)
  4. Python --函数学习3 (将函数存储在模块中)
  5. python100例 1-10
  6. 开发一个maven脚手架
  7. react 学习前期用到的插件
  8. Centos7中磁盘管理及扩展
  9. 【Java】手把手理解CAS实现原理
  10. 你以为只有马云会灌鸡汤?Linux 命令行也会!