刷
July-01-2019
这个题是BFS做的,从最外一圈算indegree,需要注意的是要以一圈为一个单位,不是像course schedule那样可以尽情从1个点开始。
最里面那圈的值就是最终的结果,可以是1,也可以是2个。
一开始按course schedule的办法,走一遍所有的点,这是多余的,Q里POLL出的是1,那么1:{2,3}里,其中2和3的SET里都是有1的,我们直接去2和3的SET里把1拿出来,不需要遍历0-N然后看每个里面有没有1。 我一开始算TIME是O(n*n)是错的,就是这个原因。。
然后装逼用stream(),比正常要慢= =
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
List<Integer> res = new ArrayList<>();
if (n == 0) return res;
HashSet<Integer>[] graph = new HashSet[n];
for (int i = 0; i < n; i ++) {
graph[i] = new HashSet<Integer>();
}
Arrays.stream(edges).forEach(edge -> {
graph[edge[0]].add(edge[1]);
graph[edge[1]].add(edge[0]);
});
ArrayDeque<Integer> q = new ArrayDeque<>();
for (int i = 0; i < n; i ++) {
if (graph[i].size() <= 1) {
q.offerLast(i);
}
}
while (!q.isEmpty()) {
int levelCount = q.size();
res = new ArrayList<>(levelCount);
for (int i = 0; i < levelCount; i ++) {
int temp = q.pollFirst();
res.add(temp);
graph[temp].stream().forEach(v -> {
graph[v].remove(temp);
if (graph[v].size() == 1) {
q.offerLast(v);
}
});
}
}
return res;
}