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;
        }
    
  • 相关阅读:
    OpenCV特征描述
    OpenCV特征点检测
    expect实现无交互操作
    文件的修改时间
    sshd登录攻击
    tcp三次握手和syn 洪水攻击
    vim使用
    PHP拓展开发
    【转】LINUX 手动建立SWAP文件及删除
    Ubuntu下crontab命令的用法
  • 原文地址:https://www.cnblogs.com/reboot329/p/11120284.html
Copyright © 2011-2022 走看看