399. Evaluate Division
来源:互联网 发布:ovs linux网桥 编辑:程序博客网 时间:2024/06/05 16:10
Equations are given in the format A / B = k
, where A
and B
are variables represented as strings, and k
is a real number (floating point number). Given some queries, return the answers. If the answer does not exist, return -1.0
.
Example:
Given a / b = 2.0, b / c = 3.0.
queries are: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? .
return [6.0, 0.5, -1.0, 1.0, -1.0 ].
The input is: vector<pair<string, string>> equations, vector<double>& values, vector<pair<string, string>> queries
, where equations.size() == values.size()
, and the values are positive. This represents the equations. Return vector<double>
.
According to the example above:
equations = [ ["a", "b"], ["b", "c"] ],values = [2.0, 3.0],queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ].
The input is always valid. You may assume that evaluating the queries will result in no division by zero and there is no contradiction.
转化为有向图解决,单个字母对应图中顶点,比例关系对应边的权重。
例如给定关系: a/b=2.0,b/c=3.0,a/d=5.0,b/e=0.5,f/b=4.0 ,根据关系构建的图如下
每次求对应比例关系的时候就从起始点开始dfs,把路径上所有边的权重(顺着边的方向为权重,逆着边的方向为1/权重)做乘积即可。
public class Solution { double curWeight;public double[] calcEquation(String[][] equations, double[] values,String[][] queries){int len=equations.length;HashMap<String, ArrayList<EvaNode>> hashmap=new HashMap<>();for(int i=0;i<len;i++){String start=equations[i][0];String end=equations[i][1];double value=values[i];if(!hashmap.containsKey(start))hashmap.put(start, new ArrayList<EvaNode>());if(!hashmap.containsKey(end))hashmap.put(end, new ArrayList<EvaNode>());hashmap.get(start).add(new EvaNode(end, value));hashmap.get(end).add(new EvaNode(start, 1/value));}int retlen=queries.length;double[] retarr=new double[retlen];for(int i=0;i<retlen;i++){String s=queries[i][0];String e=queries[i][1];if(!hashmap.containsKey(s)||!hashmap.containsKey(e)){retarr[i]=-1.0;continue;}if(s.hashCode()==e.hashCode()){retarr[i]=1.0;continue;}curWeight=1.0;if(dfs(s, e, hashmap,""))retarr[i]=curWeight;else {retarr[i]=-1;}}return retarr;}public boolean dfs(String s,String e,HashMap<String, ArrayList<EvaNode>> hashmap,String last){if(s.hashCode()==e.hashCode())return true;for(EvaNode node :hashmap.get(s))if(node.s.hashCode()!=last.hashCode()){curWeight*=node.weight;if(dfs(node.s, e, hashmap,s))return true;curWeight/=node.weight;}return false;}}class EvaNode{String s;double weight;public EvaNode(String s,double weight){this.s=s;this.weight=weight;// TODO Auto-generated constructor stub}}
- 【Leetcode】399. Evaluate Division
- [leetcode]399. Evaluate Division
- 399. Evaluate Division
- leetcode:399. Evaluate Division
- 399. Evaluate Division
- LeetCode 399. Evaluate Division
- 399. Evaluate Division
- 399. Evaluate Division
- 399. Evaluate Division
- [leetcode]399. Evaluate Division
- Leetcode 399. Evaluate Division
- 399. Evaluate Division
- 399. Evaluate Division
- 399. Evaluate Division
- [LeetCode]399. Evaluate Division
- LeetCode: 399. Evaluate Division
- Leetcode-399. Evaluate Division
- 399. Evaluate Division
- Jquery中find与each方法用法实例
- Android一些工具方法
- Oracle 调整SGA、PGA大小
- Hack Team
- 占位
- 399. Evaluate Division
- Android横竖屏切换数据保存的方法以及onSaveInstanceState() 的实现
- 莫斯科地铁交通图
- 构建者模式-Builder、Director、Product
- 手机号码检测开通微信方法
- 《Effective C++(第三版)》读书笔记
- CodeForces 48E
- android Makefile(Android.mk)解析
- asp 简单的事务的使用