399. Evaluate Division

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
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值