2024-02-07:在 Go 语言中,一家公司准备组织一次邀请名单上有 n 名员工的会议,公司准备了一个可以容纳任意数量员工的圆桌会议,员工人数为 0 到 n - 1。 每个员工都有一个喜欢的员工,当且仅当他被安排在喜欢的员工旁边时,每个员工都会参加会议,而每个员工喜欢的员工不会是他自己。
为您提供一个整数数组,下标以 0 开头,f**orite,其中 f**orite[i] 表示第 i 个员工喜欢的员工。 请返回参加会议的最大员工人数。
输入:f**orite = [2,2,1,2]。
输出: 3. 回答:2024-02-07:
来自左承云。
敏捷 351.创建一个名为 maximuminvitations 的函数,该函数接受整数数组 f**orite 作为参数。 该函数返回可以参加会议的最大员工数。
2.在 maximuminvitations 函数中,首先调用 beloved 函数以生成一个点赞表,表示每个员工喜欢的员工。
3.调用 calculatedegree 函数来计算每个员工的摄入量,即喜欢该员工的员工数量。
4.初始化队列并使用该队列进行拓扑排序。
5.将条目为 0 的所有员工添加到队列中。
6.使用 zerovisited 数组记录已经访问过的员工。
7.当队列不为空时,将从队列中删除员工并标记为已访问。
8.遍历该员工喜欢的员工列表,将其条目减去 1,如果该条目减少到 0,则将该员工添加到队列中。
9.使用 cyclevisited 数组记录已访问的员工,并计算环上的员工数。
10.如果员工最喜欢的员工也喜欢自己,那么有一个长度为 2 的环来更新 arrangetwocycle 变量。
11.否则,遍历环上的五线谱,找到最长的环,然后更新 ArrangeMoreCycle 变量。
12.比较 arrangetwocycle 和 arrangemorecycle 的值,较大的值是最终结果。
13.返回最终结果。
总时间复杂度和附加空间复杂度如下:
时间复杂度:o(n 2),其中 n 是员工人数。 遍历每个员工需要 o(n) 个时间,查找和更新相关信息可能需要 o(n) 个时间。 空间复杂度:O(n),需要额外的空间来存储偏好关系、度数和访问状态等信息。
package mainimport "fmt"func maximuminvitations(f**orite int) int }zerovisited := make(bool, n) for l < r }cyclevisited := make(bool, n) arrangetwocycle := 0 arrangemorecycle := 0 for i := 0; i < n;i++ else if curans > arrangemorecycle}if arrangetwocycle > arrangemorecycle return arrangemorecycle} generate like table func beloved(f**orite int) [int loved := make(int, n) for i := 0; i < n;i++ for i, f := range f**orite return loved} 找到每个点的摄入度func calculatedegree(loved int) [int return degree} cur is not on the loop follower chain maximum length func maxfollow(cur int, zeroed bool, from int) int ans := 0 for ,pre := range from[cur] return ans + 1}func main() result := maximuminvitations(f**orite) fmt.println(result)}
在此处插入说明。