日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 399. Evaluate Division | 399. 除法求值(图的邻接表,DFS)

發布時間:2024/2/28 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 399. Evaluate Division | 399. 除法求值(图的邻接表,DFS) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

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) {// initMap<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);// init distance mapif (!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]);// init adjacent listif (!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));}// dfsdouble[] 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。