拓扑排序——喧闹和富有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;
}
}