lc-go/solutions/3/q399/solution.go
2026-02-17 14:25:55 +09:00

60 lines
1.3 KiB
Go

package q399
func calcEquation(equations [][]string, values []float64, queries [][]string) []float64 {
seen := make(map[[2]string]float64, len(equations)*8)
queue := make([][2]string, 0, len(equations)*8)
for i := range equations {
eq, val := equations[i], values[i]
eq1, eq2 := [2]string{eq[0], eq[1]}, [2]string{eq[1], eq[0]}
seen[eq1] = val
seen[eq2] = 1 / val
queue = append(queue, eq1, eq2)
seen[[2]string{eq[0], eq[0]}] = 1
seen[[2]string{eq[1], eq[1]}] = 1
}
for ; len(queue) > 0; queue = queue[1:] {
eq := queue[0]
val := seen[eq]
for i := range equations {
var newVar string
newVal := val
switch eq[0] {
case equations[i][0]:
newVar = equations[i][1]
newVal *= 1 / values[i]
case equations[i][1]:
newVar = equations[i][0]
newVal *= values[i]
default:
continue
}
newEq1 := [2]string{newVar, eq[1]}
if _, ok := seen[newEq1]; !ok {
seen[newEq1] = newVal
queue = append(queue, newEq1)
}
newEq2 := [2]string{eq[1], newVar}
if _, ok := seen[newEq2]; !ok {
seen[newEq2] = 1 / newVal
queue = append(queue, newEq2)
}
}
}
ret := make([]float64, len(queries))
for i := range queries {
if val, ok := seen[[2]string{queries[i][0], queries[i][1]}]; ok {
ret[i] = val
} else {
ret[i] = -1
}
}
return ret
}
var _ = calcEquation