310. Minimum Height Trees


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;
    }
posted @ 2019-07-02 14:03  哇呀呀..生气啦~  阅读(89)  评论(0编辑  收藏  举报