给出方程式 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
基于上述例子,输入如下:
equations(方程式) = [ [“a”, “b”], [“b”, “c”] ],
values(方程式结果) = [2.0, 3.0],
queries(问题方程式) = [ [“a”, “c”], [“b”, “a”], [“a”, “e”], [“a”, “a”], [“x”, “x”] ].
输入总是有效的。你可以假设除法运算中不会出现除数为0的情况,且不存在任何矛盾的结果。
可以看出来这是一个图的问题,比较锻炼写深度优先的能力:
class Solution {
public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {
Map> map=new HashMap>();
int i,len=equations.length,len1=queries.length;
for(i=0;i m=new HashMap();
m.put(s2, values[i]);
map.put(s1, m);
}
else {
map.get(s1).put(s2, values[i]);
}
if(!map.containsKey(s2)) {
Map m=new HashMap();
m.put(s1, 1/values[i]);
map.put(s2, m);
}
else
map.get(s2).put(s1, 1/values[i]);
}
double ans[]=new double[len1];
for(i=0;i visited=new HashSet();
ans[i]=find(map, visited, source, target, 1);
}
return ans;
}
double find(Map> map,Set visited,String source,String target,double rate) {
if(!map.containsKey(source))
return -1;
Map link=map.get(source);
if(link.containsKey(target))
return link.get(target)*rate;
else {
for(String nebor:link.keySet()) {
if(!visited.contains(nebor)) {
visited.add(nebor);
double temp=find(map, visited, nebor, target,rate*link.get(nebor));
if(temp!=-1)
return temp;
}
}
}
return -1;
}
}
2ms,还不错