zoukankan      html  css  js  c++  java
  • 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;
        }
    
  • 相关阅读:
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业01
    学期总结
    C语言I博客作业08
    C语言I博客作业07
  • 原文地址:https://www.cnblogs.com/reboot329/p/11120284.html
Copyright © 2011-2022 走看看