leetcode399-除法求值( ̄︶ ̄)↗

给出方程式 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, vector& values, vector> 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的情况,且不存在任何矛盾的结果。

可以看出来这是一个图的问题,比较锻炼写深度优先的能力:

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,还不错

你可能感兴趣的:(Java,leetcode)