题目
比某人有钱的人当中最安静的人
https://leetcode-cn.com/problems/loud-and-rich/
dfs
class Solution {
public int[] loudAndRich(int[][] richer, int[] quiet) {
int n=quiet.length;
List<Integer>[] g=new List[n];//list列表
for(int i=0;i<n;i++){
g[i]=new ArrayList<Integer>();//初始化每个list
}
for(int i=0;i<richer.length;i++){
g[richer[i][1]].add(richer[i][0]);//记录比g[i]更有钱的人
}
int[] res=new int[n];
Arrays.fill(res,-1);//结果默认-1
for(int i=0;i<n;i++){
dfs(i,g,quiet,res);
}
return res;
}
public void dfs(int x,List<Integer>[] g,int[] quiet,int[] res){
if(res[x]!=-1)
return;//计算过了,返回
res[x]=x;//默认最安静的是自己x
for(int y:g[x]){//遍历list 遍历比这个人有钱的人y
dfs(y,g,quiet,res);//找到对于y的结果
if(quiet[res[y]]<quiet[res[x]]){//如果y的结果比x的结果安静
res[x]=res[y];//x跟y的结果相同
}
}
}
}
拓扑排序
定义:
1.从 有向无环图 图中选择一个 没有前驱(即入度为0)的顶点并输出。
2.从图中删除该顶点和所有以它为起点的有向边。
3.重复 1 和 2 直到当前的 有向无环图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。
class Solution {
public int[] loudAndRich(int[][] richer, int[] quiet) {
int n=quiet.length;
int[] res=new int[n];
for(int i=0;i<n;i++)//初始化为自己
res[i]=i;
List<Integer>[] g=new List[n];//记录比自己穷的人
int[] in=new int[n];//比自己有钱的人数量
for(int i=0;i<n;i++)//初始化list
g[i]=new ArrayList<Integer>();
for(int i=0;i<richer.length;i++){
g[richer[i][0]].add(richer[i][1]);//将比r0穷的r1加入g[r0]
in[richer[i][1]]++;//比r1有钱的人 数量+1
}
Queue<Integer> queue=new ArrayDeque<Integer>();
for(int i=0;i<n;i++){//将 没有比自己有钱的 人 加入队列
if(in[i]==0)
queue.offer(i);
}
while(!queue.isEmpty()){
int x=queue.poll();
for(int y:g[x]){//比x穷的人
if(quiet[res[x]]<quiet[res[y]]){//如果x的结果更安静,就更新y的结果
res[y]=res[x];
}
if(--in[y]==0){//y只有x这一个比自己有钱的人
queue.offer(y);
}
}
}
return res;
}
}