leetcode399. Evaluate Division

leetcode399. Evaluate Division_第1张图片
image.png

根据除法表达式,返回结果。

这里将所有的除数和被除数作为图中的节点,二者的商作为边,构造有向图,考虑用DFS来对图进行遍历,如果能从A到达B,那么表示A/B是成立的,返回边上的乘积即可,主要考察coding能力。

 public double[] calcEquation(List> equations, double[] values, List> queries) {
        // 这里可以通过map来表示有向图
        Map> map = new HashMap<>();
        double[] res = new double[queries.size()];
        for (int i = 0; i < equations.size(); i++) {
            // 根据equations中的式子分别求出a/b和b/a
            map.putIfAbsent(equations.get(i).get(0), new HashMap<>());
            map.get(equations.get(i).get(0)).put(equations.get(i).get(1), values[i]);

            map.putIfAbsent(equations.get(i).get(1), new HashMap<>());
            map.get(equations.get(i).get(1)).put(equations.get(i).get(0), 1.0 / values[i]);
        }
        for (int i = 0; i < queries.size(); i++) {
            res[i] = dfs(queries.get(i).get(0), queries.get(i).get(1), map, new HashSet<>());
        }
        return res;
    }

    public double dfs(String A, String B, Map> map, Set set) {
        if (!map.containsKey(A) || !map.containsKey(B)) {
            return -1.0;
        }
        if (A.equals(B)) {
            return 1.0;
        }
        Map pair = map.get(A);
        set.add(A);
        for (String index : pair.keySet()) {
            // 这里的set主要是为了防止邻居节点的回边,重复访问节点
            if (set.contains(index)) continue;
            double res = dfs(index, B, map, set);
            if (res > 0) return pair.get(index) * res;
        }
        return -1.0;
    }

你可能感兴趣的:(leetcode399. Evaluate Division)