我是靠谱客的博主 喜悦口红,最近开发中收集的这篇文章主要介绍leetcode834.树中距离之和---我把你当兄弟,你却认我做爸爸,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:
https://leetcode-cn.com/problems/sum-of-distances-in-tree/
这道题虽然我的答案和最快的答案时间差距还是有的,但是加入node之后,更容易理解了
简述这道题就是,本来我和你是朋友,慢慢的,你居然想让我当你儿子

public int[] sumOfDistancesInTree(int N, int[][] edges) {
    if (N == 1) {
        return new int[]{0};
    }
    TNode[] nodes = new TNode[N];
    int[] ans = new int[N];
    for (int i = 0; i < edges.length; i++) {
        TNode node = nodes[edges[i][0]];
        TNode nodeC = nodes[edges[i][1]];
        if (nodeC == null) {
            nodeC = new TNode(edges[i][1]);
            nodes[edges[i][1]] = nodeC;
        }
        if (node == null) {
            node = new TNode(edges[i][0]);
            nodes[edges[i][0]] = node;
        }
        //因为是无向图,所以大家互为朋友
        node.friends.add(nodeC);
        nodeC.friends.add(node);
    }
    TNode top = nodes[0];//选择你当老大
    getNumAnsS(null, top);
    top.score = top.scoreC;//祖宗的得分知道了
    setScore(top, ans, N);
    return ans;
}

private void setScore(TNode node, int[] ans, int N) {
    ans[node.key] = node.score;
    for (TNode children : node.friends) {
        //自己到各个路径的和为:已知父亲的得分,自己子孙的路径是更近的(- children.num),从父亲那边过来的更远(+ (N - children.num))
        children.score = node.score + (N - children.num) - children.num;
        setScore(children, ans, N);
    }
}

private void getNumAnsS(TNode top, TNode node) {
    if (node.friends.size() == 1) {
        node.num = 1;
        node.scoreC = 0;
    }
    node.friends.remove(top);//node把top当朋友,top想当爸爸,只能top找node,node找不到top
    int num = 1;
    int scoreC = 0;
    for (TNode children : node.friends) {//名义是朋友,实际当你是儿子
        getNumAnsS(node, children);
        num += children.num;
        scoreC += children.num + children.scoreC;
    }
    node.num = num;//我的子孙数为每个儿子的子孙数加自己
    node.scoreC = scoreC;//自己的到每个子孙的路径和是:我先到每个儿子那,再从儿子那,加上儿子的子孙路径
}

class TNode {
    int key;//我的值
    int score;//我最终的得分
    int scoreC;//我到我所有的子孙的路径
    int num;//包括自己,我的子孙有多少
    Set<TNode> friends = new HashSet<>();

    public TNode(int key) {
        this.key = key;
    }
}

最后

以上就是喜悦口红为你收集整理的leetcode834.树中距离之和---我把你当兄弟,你却认我做爸爸的全部内容,希望文章能够帮你解决leetcode834.树中距离之和---我把你当兄弟,你却认我做爸爸所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部