交通枢纽
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 31 ms, 内存: 16.4 MB
/*
思路:
1. 使用流收集每个节点的入度和出度。
2. 使用流过滤并查找满足条件的节点。
*/
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class TrafficHubStream {
public int findHub(int[][] path) {
Map<Integer, Integer> inDegree = new HashMap<>();
Map<Integer, Integer> outDegree = new HashMap<>();
Set<Integer> nodes = Stream.of(path).flatMapToInt(p -> Stream.of(p[0], p[1]).mapToInt(i -> i)).boxed().collect(Collectors.toSet());
Stream.of(path).forEach(p -> {
int from = p[0];
int to = p[1];
outDegree.put(from, outDegree.getOrDefault(from, 0) + 1);
inDegree.put(to, inDegree.getOrDefault(to, 0) + 1);
});
int totalNodes = nodes.size();
return nodes.stream()
.filter(node -> outDegree.getOrDefault(node, 0) == 0 && inDegree.getOrDefault(node, 0) == totalNodes - 1)
.findFirst()
.orElse(-1);
}
public static void main(String[] args) {
TrafficHubStream th = new TrafficHubStream();
int[][] path1 = {{0,1},{0,3},{1,3},{2,0},{2,3}};
int[][] path2 = {{0,3},{1,0},{1,3},{2,0},{3,0},{3,2}};
System.out.println(th.findHub(path1)); // 输出 3
System.out.println(th.findHub(path2)); // 输出 -1
}
}
解释
方法:
题解的思路是首先使用两个字典来记录每个节点的出度和入度。res1字典记录节点的出度(即从该节点出发的边数),res2字典记录节点的入度(即指向该节点的边数)。同时,使用一个集合res来记录所有出现过的节点。遍历一遍输入的边列表,填充这两个字典和节点集合。接着,遍历集合中的每个节点,检查是否存在一个节点c,使得该节点的出度为0(res1[c] == 0)且入度为其他所有节点到它的总数(res2[c] == n - 1,其中n是所有不同节点的数量)。如果找到这样的节点,就返回该节点,否则返回-1。这种方法直接通过统计入度和出度来判断是否满足题目中的交通枢纽条件。
时间复杂度:
O(m+n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在题解中使用两个字典来分别记录出度和入度,而不是使用一个字典记录两者?
▷🦆
在计算节点总数n时,是否考虑了可能存在的孤立节点(即未在path中作为起点或终点出现的节点)?
▷🦆
题解中提到,如果节点c的出度为0且入度为n-1则认为它是交通枢纽。这种方法是否考虑了图中可能存在的环路对结果的影响?
▷