拓扑排序——喧闹和富有851

喧闹和富有

题目:喧闹和富有

    有一组 n 个人作为实验对象,从 0 到 n - 1 编号。
    给你一个数组 richer ,其中 richer[i] = [ai, bi] 表示 person ai 比 person bi 更有钱。
    另给你一个整数数组 quiet ,其中 quiet[i] 是 person i 的安静值。 
    要求:返回一个整数数组 answer 作为答案,其中 answer[x] = y 的前提是,y比x富有,同时y是比x富有中最安静的人。

 

示例1:

输入:richer = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet = [3,2,5,4,6,1,7,0]
输出:[5,5,2,5,4,5,6,7]

题解

    建立richer的拓扑排序,根据拓扑排序更新每个人的answer。

class Solution {
        public int[] loudAndRich(int[][] richer, int[] quiet) {
            Queue<Integer> queue = new ArrayDeque<>();
            List<Integer> map[] = new List[quiet.length];
            int book[] = new int[quiet.length];
            int res[] = new int[quiet.length];

            //建立拓扑图,并计算入度
            for (int i = 0; i < richer.length; i++) {
                if(map[richer[i][0]]==null) map[richer[i][0]]=new ArrayList<>();
                map[richer[i][0]].add(richer[i][1]);
                book[richer[i][1]]++;
            }

            //入度为0,进队列
            for(int i=0;i<book.length;i++){
                if(book[i]==0) queue.add(i);
                res[i]=i;
            }

            //根据拓扑排序,更新每个人的最安静的人
            while (!queue.isEmpty())
            {
                int temp=queue.poll();
                if(map[temp]!=null)
                {
                    for(int pool: map[temp])
                    {
                        if(quiet[res[temp]]<quiet[res[pool]]) res[pool]=res[temp];
                        if(--book[pool]==0) queue.add(pool);
                    }
                }
            }
            return res;
        }
    }
posted @ 2021-12-24 13:23  言思宁  阅读(18)  评论(0编辑  收藏  举报