Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅
第一阶段目标是:200道,每天1到2篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目: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;
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹