每日一题 LeetCode 851. 喧闹和富有 java题解

题目

比某人有钱的人当中最安静的人
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值