題目
https://leetcode.com/problems/evaluate-division/
題解
題目看著復雜,實際上是圖的 DFS。
例如,已知 a/b, b/c, c/d,想求 a/d 的話,得到路徑就是 a->b->c->d。
根據乘除法的性質,將路過的所有數相乘即可。為了方便將路過的所有數字相乘,我們初始化一個k:k:v 形式的 map,其含義是 from:to:distance。
由于本題的背景是連等式,所以全局只有一條可行路徑,在 DFS 的過程中,只要發現了可行路徑,直接一把梭返回。
附上潦草的草稿:
class Solution {public double[] calcEquation(List<List<String>> equations
, double[] values
, List<List<String>> queries
) {Map<String, List<String>> G = new HashMap<>();Map<String, Map<String, Double>> kkv
= new HashMap<>();for (int i
= 0; i
< equations
.size(); i
++) {List<String> pair
= equations
.get(i
);if (!kkv
.containsKey(pair
.get(0))) kkv
.put(pair
.get(0), new HashMap<>());kkv
.get(pair
.get(0)).put(pair
.get(1), values
[i
]);if (!kkv
.containsKey(pair
.get(1))) kkv
.put(pair
.get(1), new HashMap<>());kkv
.get(pair
.get(1)).put(pair
.get(0), 1.0 / values
[i
]);if (!G.containsKey(pair
.get(0))) G.put(pair
.get(0), new ArrayList<>());if (!G.containsKey(pair
.get(1))) G.put(pair
.get(1), new ArrayList<>());G.get(pair
.get(0)).add(pair
.get(1));G.get(pair
.get(1)).add(pair
.get(0));}double[] res
= new double[queries
.size()];int p
= 0;for (List<String> pair
: queries
) {Double dfs
= dfs(G, kkv
, new HashSet<>(), pair
.get(0), pair
.get(1), 1.0);res
[p
++] = dfs
== null ? -1 : dfs
;}return res
;}public Double dfs(Map<String, List<String>> G, Map<String, Map<String, Double>> kkv
, Set<String> visited
, String from
, String to, Double distance
) {if (!G.containsKey(from
) || !G.containsKey(to)) return null;if (from
.equals(to)) return distance
;for (String next
: G.get(from
)) {if (!visited
.contains(next
)) {if (kkv
.containsKey(from
) && kkv
.get(from
).containsKey(next
)) {visited
.add(next
);Double res
= dfs(G, kkv
, visited
, next
, to, distance
* kkv
.get(from
).get(next
));visited
.remove(next
);if (res
!= null) return res
;}}}return null;}
}
總結
以上是生活随笔為你收集整理的leetcode 399. Evaluate Division | 399. 除法求值(图的邻接表,DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。