Сложность: medium
В социальной группе есть n человек, пронумерованных от 0 до n - 1. Вам дан массив logs, где logs[i] = [timestampi, xi, yi] указывает, что xi и yi станут друзьями в момент времени timestampi.
Дружба является симметричной. Это означает, что если a является другом b, то b является другом a. Также человек a знаком с человеком b, если a является другом b или a является другом кого-то, кто знаком с b.
Верните самое раннее время, когда каждый человек стал знаком с каждым другим человеком. Если такого времени не существует, верните -1.
Пример:
Input: logs = [[0,2,0],[1,0,1],[3,0,3],[4,1,2],[7,3,1]], n = 4
Output: 3
Explanation: At timestamp = 3, all the persons (i.e., 0, 1, 2, and 3) become friends.
👨💻 Алгоритм:
1⃣Отсортируйте логи по времени в хронологическом порядке, так как в задаче не указано, отсортированы ли они.
2⃣Пройдитесь по отсортированным логам, применяя структуру данных "Объединение-Поиск":
Для каждого лога объедините двух участников, упомянутых в логе, с помощью функции union(a, b).
Каждое объединение добавляет новые связи между участниками.
3⃣Следите за количеством групп:
Изначально каждый участник рассматривается как отдельная группа.
Количество групп уменьшается с каждым полезным объединением.
Момент, когда количество групп уменьшается до одной, является самым ранним моментом, когда все участники становятся связанными (друзьями). Верните этот момент времени.
Если такого момента не существует, верните -1.
😎 Решение:
class UnionFind(n: Int) {
private val parent = IntArray(n) { it }
private val rank = IntArray(n) { 1 }
fun find(x: Int): Int {
if (parent[x] != x) {
parent[x] = find(parent[x])
}
return parent[x]
}
fun union(x: Int, y: Int): Boolean {
val rootX = find(x)
val rootY = find(y)
if (rootX != rootY) {
if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX
} else if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY
} else {
parent[rootY] = rootX
rank[rootX] += 1
}
return true
}
return false
}
}
class Solution {
fun earliestAcq(logs: Array<IntArray>, n: Int): Int {
logs.sortBy { it[0] }
val uf = UnionFind(n)
var groupCount = n
for (log in logs) {
val (timestamp, friendA, friendB) = log
if (uf.union(friendA, friendB)) {
groupCount--
}
if (groupCount == 1) {
return timestamp
}
}
return -1
}
}Ставь 👍 и забирай 📚 Базу знаний