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 }