【刷题日记】2039. 网络空闲的时刻

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

【刷题日记】2039. 网络空闲的时刻

本次刷题日记的第 9 篇,力扣题为:2039. 网络空闲的时刻中等

一、题目描述:

乍看今天的这道题,有点要被劝退的感觉 !! xdm 有这种感受吗

但是为了提高我们自己的能力,我们还是有这个耐心来将题目看完的,并且会找出其中的重点信息

二、思路分析:

1、这道题考察了什么思想?你的思路是什么?

这道题具体需要如何去实现呢,我们可以来分析一下,题中给我们展示了哪些有用的信息

  • 题目会给出多个服务器,从 0 到 n -1 个服务器编号,且 0 是主服务器其他的服务器都会向 主服务器发送消息主服务器也会原路回应消息

  • 节点和节点之间,能够在 1 秒钟将所有信息全部发送完毕

  • 每个服务器和服务器之间都是可以通过某个路径进行通信的,但是题目要求的是最小路径 , 且服务器和服务器之间,顶多有 1 条信息线,不会出现两个节点之间有 2 条甚至更多的信息线

  • 题目中还提供一个数组,来表示对应服务器发送信息出去后的超时重发时间,如果在指定时间内服务器收到了主服务器 0 的回包,那么就不重发,否则就重发

  • 最后我们需要计算网络变空闲的最早时刻,那就意味着,网络中每一个节点都要是空闲的才行,此刻计算最晚空闲下来的节点时间,就是整个网络的最早空闲时间

    毕竟整体的结果,是团队内每一个人努力付出的结果

那么,根据题中的示例,我们可以来分析和推演一下:

edges = [[0,1],[1,2]], patience = [0,2,1] 为例

通过上图,我们需要分清楚有 2 种情况,那就是该节点从发包到收到包的时间是小于超时时间 p(2t <= p ),那么就不会重发,总共耗时 就是 2t 秒,第 2t + 1 秒就是空闲的

只有当发第一个包到收到的时间大于超时时间 p 的时候(2t > p),才会重发,总共耗时 p * ((2t -1) / p) + 2t ,最终 p * ((2t -1) / p) + 2t + 1 秒开始空闲

那么已经知道如何计算网络的最晚空闲时间的数学原理之后,我们就可以看看这个题的最短路径问题了

最短路径,详细分析就不做赘述了,对于之后的最短路径的题再一起来推理,暂时我们可以理解,先把节点和节点的连接关系表示出来,如下:

接下来,我们直接可以使用 广度优先算法 BFS 来计算最短路径了

2、尝试编码

根据上述逻辑和分析,我们就可以翻译成如下代码

编码如下:

func networkBecomesIdle(edges [][]int, p []int) (ans int) {
    n := len(p)
    g := make([][]int, n)
    // 先找到节点和节点之间的连接关系,如上述的案例,此处就能得到
    //g[0] = [1]    -- 表示 0 这个节点可以连接  1 节点
	//g[1] = [0,2] -- 表示 1 这个节点,可以连接 0节点, 和 2 节点
	//g[2] = [1]    -- 表示 2 这个节点,可以连接 1 节点
    for _, e := range edges {
        x, y := e[0], e[1]
        g[x] = append(g[x], y)
        g[y] = append(g[y], x)
    }

    vis := make([]bool, n)
    vis[0] = true
    q := []int{0}
    // 通过 bfs 的方式来来计算最短路径
    for t := 1; q != nil; t++ {
        tmp := q
        q = nil
        for _, x := range tmp {
            for _, v := range g[x] {
                if vis[v] {
                    continue
                }
                vis[v] = true
                q = append(q, v)
                // 计算最晚空闲时间
                ans = max(ans, (t*2-1)/p[v] * p[v] + t*2 +1)
            }
        }
    }
    return
}

func max(a, b int) int {
    if b > a {
        return b
    }
    return a
}
复制代码

通过上述代码,我们知道主要逻辑是:

  • 找到节点和节点间的连接关系
  • 通过 bfs 广度优先算法,计算节点到 主节点 0 的最短距离,并计算该节点的最晚空闲时间
  • 最终取,数值最大的最晚空闲时间为整个网络的最早空闲时间

四、总结:

整个题,需要弄清楚整个网络的最早空闲时间是依赖于节点的最晚空闲时间,需要处理好超时重传的时间问题

本题的时间复杂度和空间复杂度为 : O(n+m)

原题地址:2039. 网络空闲的时刻

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

おすすめ

転載: juejin.im/post/7077060758579707940