刷题前唠嗑

好好好,这么玩是吧,11 月刚准备开始刷每日一题,就给我来了一道 hard,我连题目都看不懂他在讲些什么,但是 11 月第一题我势在必得,必须拿下他

题目:参加会议的最多员工数

题目链接:2127. 参加会议的最多员工数

题目描述

【LeetCode】每日一题 2023_11_1 参加会议的最多员工数(没做出来)-LMLPHP

代码与解题思路

func maximumInvitations(favorite []int) int {
    n := len(favorite)
    deg := make([]int, n)
    for _, f := range favorite {
        deg[f]++ // 统计基环树每个节点的入度
    }

    rg := make([][]int, n) // 反图
    q := []int{}
    for i, d := range deg {
        if d == 0 {
            q = append(q, i)
        }
    }
    for len(q) > 0 { // 拓扑排序,剪掉图上所有树枝
        x := q[0]
        q = q[1:]
        y := favorite[x] // x 只有一条出边
        rg[y] = append(rg[y], x)
        if deg[y]--; deg[y] == 0 {
            q = append(q, y)
        }
    }

    // 通过反图 rg 寻找树枝上最深的链
    var rdfs func(int) int
    rdfs = func(x int) int {
        maxDepth := 1
        for _, son := range rg[x] {
            maxDepth = max(maxDepth, rdfs(son)+1)
        }
        return maxDepth
    }

    maxRingSize, sumChainSize := 0, 0
    for i, d := range deg {
        if d == 0 {
            continue
        }

        // 遍历基环上的点
        deg[i] = 0 // 将基环上的点的入度标记为 0,避免重复访问
        ringSize := 1 // 基环长度
        for x := favorite[i]; x != i; x = favorite[x] {
            deg[x] = 0 // 将基环上的点的入度标记为 0,避免重复访问
            ringSize++
        }

        if ringSize == 2 { // 基环长度为 2
            sumChainSize += rdfs(i) + rdfs(favorite[i]) // 累加两条最长链的长度
        } else {
            maxRingSize = max(maxRingSize, ringSize) // 取所有基环长度的最大值
        }
    }
    return max(maxRingSize, sumChainSize)
}

思路:我没学过图论,连什么有向图无向图都不知道,什么拓补排序,只听过这个名字,完全没了解过,回头找时间入门一下图论吧,现在看来做不出来了了

然后就是丝滑小连招 Ctrl C,Ctrl V,纳入收藏夹

纳入收藏夹

【LeetCode】每日一题 2023_11_1 参加会议的最多员工数(没做出来)-LMLPHP

结语

今日摆烂,明日再战。

11-01 14:15