dengxinyi 6 年之前
父節點
當前提交
cd9e1fa094
共有 1 個文件被更改,包括 51 次插入1 次删除
  1. 51 1
      medium/399.evaluate-division.go

+ 51 - 1
medium/399.evaluate-division.go

@@ -1,3 +1,53 @@
+type pair struct {
+	key   string
+	ratio float64
+}
+
 func calcEquation(equations [][]string, values []float64, queries [][]string) []float64 {
-	
+	m, n := len(values), len(queries)
+	route := make(map[string][]pair)
+	for i := 0; i < m; i++ {
+		a, b := equations[i][0], equations[i][1]
+		if a == b {
+			if _, ok := route[a]; !ok {
+				route[a] = make([]pair, 0)
+			}
+			continue
+		}
+		route[a] = append(route[a], pair{b, values[i]})
+		route[b] = append(route[b], pair{a, 1.0 / values[i]})
+	}
+	ans := make([]float64, n)
+	for i := 0; i < n; i++ {
+		visited := make(map[string]bool)
+		if ratio := dfs(route, queries[i][0], queries[i][1], &visited); ratio == 0.0 {
+			ans[i] = -1.0
+		} else {
+			ans[i] = ratio
+		}
+	}
+	return ans
+}
+
+func dfs(route map[string][]pair, a, b string, visited *map[string]bool) float64 {
+	if a == b {
+		if _, ok := route[a]; ok {
+			return 1.0
+		} else {
+			return 0.0
+		}
+	}
+	(*visited)[a] = true
+	adj := route[a]
+	for i := range adj {
+		if (*visited)[adj[i].key] {
+			continue
+		}
+		ratio := adj[i].ratio * dfs(route, adj[i].key, b, visited)
+		if ratio != 0.0 {
+			return ratio
+		}
+	}
+	return 0.0
 }
+