-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathloud-and-rich.go
49 lines (42 loc) · 913 Bytes
/
loud-and-rich.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package main
import "fmt"
var memo map[int][]int
func calc(graph map[int][]int,
quiet []int, i int) (rNode int, rQuiet int) {
if pair, ok := memo[i]; ok {
return pair[0], pair[1]
}
rNode = i
rQuiet = quiet[i]
for _, node := range graph[i] {
n, q := calc(graph, quiet, node)
if q < rQuiet {
rNode = n
rQuiet = q
}
}
memo[i] = []int{rNode, rQuiet}
return
}
func loudAndRich(richer [][]int, quiet []int) []int {
Richer := make(map[int][]int)
memo = make(map[int][]int)
for _, pair := range richer {
rich := pair[0]
poor := pair[1]
Richer[poor] = append(Richer[poor], rich)
}
//fmt.Println(Richer)
answer := make([]int, len(quiet))
for i := range answer {
n, _ := calc(Richer, quiet, i)
answer[i] = n
}
return answer
}
func main() {
fmt.Println(
loudAndRich([][]int{
{1, 0}, {2, 1}, {3, 1}, {3, 7}, {4, 3}, {5, 3}, {6, 3},
}, []int{3, 2, 5, 4, 6, 1, 7, 0}))
}