你版今天线虫帅朝都去FF惹
剩我还在解每日leetcode,今天还是hard,我要吐了
2092. Find All People With Secret
有0~n-1个人,并且0有一个秘密,他告诉了firstPerson
有一个array meetings[x,y,time]
如果x、y其中一个人知道了秘密他就会告诉对方
而且一个人在同时间可以有多个meetings,假设他在time=i的时候知道了秘密
那么在time=i跟他meeting的人都会知道秘密
请问最后会有多少人知道秘密
思路 :
直觉这是一题graph搭配union-find
建立find function来找该节点的group
将meeting按照时间排序
接着建立1个groups array,并且设值group[i]=i
将index 0、firstPerson设成0
去依照meeting时间遍历meetings矩阵
每一次分别找meetings[i][0]、meetings[i][1]属于哪个group
并且把较大的那个group的值更改成较小的group
要进到下个meeting时间的时候重置group矩阵
如果find(group,i)=0 那就将group[i]=0
不然group[i]=i
这个时间内有meetings的人才要重置,所以有一个array去纪录该时间有谁meeting过
如果不纪录,而是0~n全部重置会超出时间限制
最后去找group[i]=0的就是答案
golang code
func find(array *[]int, index int) int {
for (*array)[index] != index {
index = (*array)[index]
}
return index
}
func findAllPeople(n int, meetings [][]int, firstPerson int) []int {
slices.SortFunc[[][]int, []int](meetings, func(i, j []int) int {
return i[2] - j[2]
})
group := make([]int, n)
for i := 0; i < n; i++ {
group[i] = i
}
group[firstPerson] = 0
i := 0
l := len(meetings)
temp := []int{}
for i < l {
time := meetings[i][2]
temp = temp[:0]
for i < l && meetings[i][2] == time {
g1 := find(&group, meetings[i][0])
g2 := find(&group, meetings[i][1])
group[max(g1, g2)] = min(g1, g2)
temp = append(temp, meetings[i][0], meetings[i][1])
i++
}
for _, val := range temp {
if find(&group, val) != 0 {
group[val] = val
} else {
group[val] = 0
}
}
}
ans := []int{}
for i:=0;i<n;i++{
if group[i]==0{
ans = append(ans, i)
}
}
return ans
}