Leedcode 851. Loud and Rich 拓扑排序+深搜+截枝

题目连接:851. Loud and Rich​​​​​​​

解题思路:

1.构建邻接表,从起点开始构造,后面的结点都比它富有,并记录富结点的入度

2.以最穷的点为起点深搜(即入度为0的结点,递归求所有比他富的结点最安静的值)

3.截肢:搜索完成的结点可以直接使用,用v来记录

class Solution {
    List<List<Integer>> edges = new ArrayList<>();
    int d[];
    boolean v[];
    int ans[];
    public int[] loudAndRich(int[][] richer, int[] quiet) {
        int  n = quiet.length;
        d = new int[n];
        ans = new int[n];
        v = new boolean[n];
        for(int i = 0; i< n;++i){
            edges.add(new ArrayList<Integer>());
        }
        for(int a[]:richer){
            edges.get(a[1]).add(a[0]);
            ++d[a[0]];
        }
        for(int i = 0; i< n; ++i){
            if(d[i] == 0){
                dfs(i, quiet);
            }
        }
        return ans;
    }

    private int dfs(int u, int[] quiet) {
        if(v[u]){//如果已经求过了
            return ans[u];
        }
        int min = u;//当前结点的安静度
        for(int v : edges.get(u)){
            int t = dfs(v, quiet);//相邻结点子树下最安静的
            if(quiet[t] < quiet[min]) min =t;
        }
        v[u] = true;
        ans[u] = min;
        return min;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值