【Leetcode刷题第三天】2039. 网络空闲的时刻[JAVA]

【Leetcode刷题第三天】2039. 网络空闲的时刻[JAVA] 一起来刷题吧~

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

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

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

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

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

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

示例:
在这里插入图片描述
输入:edges = [[0,1],[1,2]], patience = [0,2,1]
输出:8

示例2:
在这里插入图片描述
输入:edges = [[0,1],[0,2],[1,2]], patience = [0,10,10]
输出:3
解释:数据服务器 1 和 2 第 2 秒初收到回复信息。
从第 3 秒开始,网络变空闲。

题目真的有点绕,下面画图来看:
在这里插入图片描述

  1. 假设每个到达各个子服务器需要的时间 t,则子服务器完成一次收发需要的时间为 t*2
  2. 每个节点一共重发 time=(t*2-1)/patience[i] 次
  3. 最后一次开始重发的时间为 time*patience[i]
  4. 最后一次重发收到的时间为 timepatience[i]+t2 次

总结:
这也是看了Leetcode上大佬 [钰娘娘] 的题解总结出来的,还有所不足。大家也可以去这道题的题解区域看看大佬们的想法。

代码如下:

class Solution {
    
    
    public int networkBecomesIdle(int[][] edges, int[] patience) {
    
    
        int n=patience.length;
        Map<Integer,List<Integer>> graph=new HashMap<>();
        for(int []edge:edges){
    
    
            graph.putIfAbsent(edge[0],new ArrayList<>());
            graph.get(edge[0]).add(edge[1]);

            graph.putIfAbsent(edge[1],new ArrayList<>());
            graph.get(edge[1]).add(edge[0]);
        }

        boolean[] visited=new boolean[n];
        int ans=0;
        visited[0]=true;

        Queue<Integer> quene=new LinkedList<>();
        quene.offer(0);
        //offer(E e)方法在不违反容量限制的情况下可以立即将指定的元素插入此队列。此方法优于add()方法,因为在容器的容量已满时,此方法不会引发异常,因为它会返回false。
        int step=0;
        while(!quene.isEmpty()){
    
    
            int size=quene.size();
            for(int i=0;i<size;i++){
    
    
                int point=quene.poll();
                //从队列头部删除一个元素。在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll() 方法只会返回 null 。

                if(point!=0){
    
    
                    int repeatTime=(step*2-1)/patience[point];
                    ans=Math.max(repeatTime*patience[point]+step*2+1,ans);
                }

                if(!graph.containsKey(point)) continue;

                for(Integer next:graph.get(point)){
    
    
                    if(!visited[next]){
    
    
                        visited[next]=true;
                        quene.offer(next);
                    }
                }
            }
        ++step;
        }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_52338896/article/details/123609426