开启我的LeetCode刷题日记:2039. 网络空闲的时刻

112 阅读4分钟

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

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:2039. 网络空闲的时刻

给你一个有 n 个服务器的计算机网络,服务器编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] = [ui, vi] 表示服务器 ui 和 vi 之间有一条信息线路,在 一秒 内它们之间可以传输 任意 数目的信息。再给你一个长度为 n 且下标从 0 开始的整数数组 patience 。

题目保证所有服务器都是 相通 的,也就是说一个信息从任意服务器出发,都可以通过这些信息线路直接或间接地到达任何其他服务器。

编号为 0 的服务器是 主 服务器,其他服务器为 数据 服务器。每个数据服务器都要向主服务器发送信息,并等待回复。信息在服务器之间按 最优 线路传输,也就是说每个信息都会以 最少时间 到达主服务器。主服务器会处理 所有 新到达的信息并 立即 按照每条信息来时的路线 反方向 发送回复信息。

在 0 秒的开始,所有数据服务器都会发送各自需要处理的信息。从第 1 秒开始,每 一秒最 开始 时,每个数据服务器都会检查它是否收到了主服务器的回复信息(包括新发出信息的回复信息):

如果还没收到任何回复信息,那么该服务器会周期性 重发 信息。数据服务器 i 每 patience[i] 秒都会重发一条信息,也就是说,数据服务器 i 在上一次发送信息给主服务器后的 patience[i] 秒 后 会重发一条信息给主服务器。 否则,该数据服务器 不会重发 信息。 当没有任何信息在线路上传输或者到达某服务器时,该计算机网络变为 空闲 状态。

请返回计算机网络变为 空闲 状态的 最早秒数 。

我的思路

仔细分析题目,可以看出要求这个空闲时间,其实可以分为两步:

①计算出所有节点与0点的距离。

②根据距离与patience中发出信号来计算这个位置的服务器什么时间空闲,然后对比出最大的那个时间。

其中①的计算先根据edges将图放在一个对象中方便遍历,然后从第0个节点的延伸节点开始遍历,然后每次把需要往下延伸的节点取出来放入新的arr。

其中②的计算可以根据推导整个过程算出来时间为 服务器最后一次发出信号的时间 + 到0点然后回来的时间,然后 +1就是空闲时间。

代码实现

/**
 * @param {number[][]} edges
 * @param {number[]} patience
 * @return {number}
 */
var networkBecomesIdle = function (edges, patience) {
    const nodeMap = {};
    for (let line of edges) {
        const node1 = nodeMap[line[0]] || [];
        const node2 = nodeMap[line[1]] || []
        node1.push(line[1]);
        node2.push(line[0]);
        nodeMap[line[0]] = node1;
        nodeMap[line[1]] = node2;
    };
    const disArr = Array(patience.length).fill(Infinity);
    disArr[0] = 0;
    let arr = nodeMap[0];
    let dis = 0;
    while (arr.length) {
        dis++;
        const newArr = [];
        for (let idx of arr) {
            if (dis < disArr[idx]) {
                newArr.push(...nodeMap[idx]);
                disArr[idx] = dis;
            }
        }
        arr = newArr
    };
    // console.log(disArr);
    let res = 0;
    for (let i = 1; i < patience.length; i++) {
        const t = patience[i];
        const time = Math.floor((disArr[i] * 2 - 1) / t) * t + disArr[i] * 2 + 1;
        res = Math.max(res, time)
    }
    // console.log(res)
    return res;
};

总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹