2022/03/20每日一题 LeetCode_2039

这题需要运用到广度优先搜索的知识

广度优先搜索之后可以得到每个节点到0节点的所需的最小往返时间

int[] retTime = new int[n];//每个节点往返所需的最小时间

那么就可以进行分情况讨论,分为如下两种情况

余数 = (retTime[i]) % patience[i];

 

1.有余数(即余数大于零)

节点重发数据的次数=往返的时间/等待的时间

timei = ((retTime[i]) / patience[i]) * patience[i] + (retTime[i]);

 

2.刚刚好整除(即余数等于零)

节点重发数据的次数=(往返的时间/等待的时间)-1

为什么这里就要-1呢?

因为从题目的描述中可以看到,在每一秒的最开始会进行检测是否有收到回复信息,也就是说会先检测,再回复;

所以说,刚刚好整除时,会出现要发送信息时回复信息已经到达的时间节点,由于是先检测,此时这个信息没有发送出去。

timei = ((retTime / patience[next]) - 1) * patience[next] + retTime;

然后只需要取时间的最大值即可

ans = Math.max(ans,timei);

最后返回

ans+1

为什么要+1?

因为题目要求从那一秒开始网络有空闲,而ans是网络繁忙的最后一秒,因此ans的下一秒就是网络开始空闲的第一秒。

代码

 1 class Solution {
 2     public int networkBecomesIdle(int[][] edges, int[] patience) {
 3         //广度优先搜索
 4         int n = patience.length;
 5         boolean[] visited = new boolean[n];
 6         List<Integer>[] map = new List[n];
 7         for(int i = 0; i < n; i++){
 8             map[i] = new ArrayList<>();
 9         }
10         int len = edges.length;
11         for(int i = 0; i < len; i++){
12             int ui = edges[i][0];
13             int vi = edges[i][1];
14             map[ui].add(vi);
15             map[vi].add(ui);
16         }
17         Deque<Integer> que = new ArrayDeque<Integer>();
18         que.offer(0);
19         visited[0] = true;
20         int retTime = 0;//当前节点的往返时间
21         int ans = 0;
22         while(!que.isEmpty()){
23             int size = que.size();
24             retTime += 2;
25             for(int i = 0; i < size; i++){
26                 int cur = que.poll();
27                 List<Integer> nextList = map[cur];
28                 for(Integer next : nextList){
29                     if(!visited[next]){
30                         visited[next] = true;
31                         que.offer(next);
32                         int left = retTime % patience[next];
33                         int timei = 0;
34                         if(left > 0){
35                             timei = (retTime / patience[next]) * patience[next] + retTime;
36                         }else if(left == 0){
37                             timei = ((retTime / patience[next]) - 1) * patience[next] + retTime;
38                         }
39                         ans = Math.max(ans,timei);
40                     }
41                 }
42             }
43         }
44         return ans + 1;
45 
46         /*
47         n = patience.length;
48         int[] retTime = new int[n];每个节点往返所需的最小时间
49         余数 = (retTime[i]) % patience[i];
50         if(余数 > 0){
51             timei = ((retTime[i]) / patience[i]) * patience[i] + (retTime[i]);
52         }else if(余数 == 0){
53             timei = (((retTime[i]) / patience[i]) -1) * patience[i] + (retTime[i]);
54         }
55         ans = Math.max(timei,ans);
56         
57         return ans + 1;
58         
59         */
60     }
61 }

 

 

posted @ 2022-03-20 19:06  雨下_整夜  阅读(42)  评论(0编辑  收藏  举报