1
0
Fork 0
mirror of https://gitlab.com/mfocko/LeetCode.git synced 2024-11-14 09:59:41 +01:00
LeetCode/go/build-a-matrix-with-conditions.go

69 lines
1.2 KiB
Go
Raw Normal View History

package main
import aq "github.com/emirpasic/gods/v2/queues/arrayqueue"
func buildMatrix(k int, rowConditions [][]int, colConditions [][]int) [][]int {
toposort := func(edges [][]int, n int) []int {
neighbours := make([][]int, n+1)
for i := range n + 1 {
neighbours[i] = []int{}
}
degrees, order := make([]int, n+1), make([]int, n)
for _, edge := range edges {
u, v := edge[0], edge[1]
neighbours[u] = append(neighbours[u], v)
degrees[v]++
}
queue := aq.New[int]()
for i := 1; i <= n; i++ {
if degrees[i] == 0 {
queue.Enqueue(i)
}
}
idx := 0
for !queue.Empty() {
u, _ := queue.Dequeue()
order[idx] = u
n--
for _, v := range neighbours[u] {
degrees[v]--
if degrees[v] == 0 {
queue.Enqueue(v)
}
}
idx++
}
if n != 0 {
return []int{}
}
return order
}
rowOrder, colOrder := toposort(rowConditions, k), toposort(colConditions, k)
if len(rowOrder) == 0 || len(colOrder) == 0 {
return [][]int{}
}
matrix := make([][]int, k)
for i := range k {
matrix[i] = make([]int, k)
}
for row := range k {
for col := range k {
if rowOrder[row] == colOrder[col] {
matrix[row][col] = rowOrder[row]
}
}
}
return matrix
}