OJ练习第138题——树中距离之和

这篇具有很好参考价值的文章主要介绍了OJ练习第138题——树中距离之和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

树中距离之和

力扣链接:834. 树中距离之和

题目描述

给定一个无向、连通的树。树中有 n 个标记为 0…n-1 的节点以及 n-1 条边 。

给定整数 n 和数组 edges , edges[i] = [ai, bi]表示树中的节点 ai 和 bi 之间有一条边。

返回长度为 n 的数组 answer ,其中 answer[i] 是树中第 i 个节点与所有其他节点之间的距离之和。

示例

OJ练习第138题——树中距离之和,OJ练习,深度优先,算法,leetcode,java

解题思路

定义 dp[u] 表示以 u 为根的子树,它的所有子节点到它的距离之和,同时定义 sz[u] 表示以 u 为根的子树的节点数量。进行换根操作,维护dp值。

Java代码

class Solution {
    int[] ans;
    int[] sz;
    int[] dp;
    List<List<Integer>> graph;

    public int[] sumOfDistancesInTree(int n, int[][] edges) {
        ans = new int[n];
        sz = new int[n];
        dp = new int[n];
        graph = new ArrayList<List<Integer>>();
        for (int i = 0; i < n; ++i) {
            graph.add(new ArrayList<Integer>());
        }
        for (int[] edge: edges) {
            int u = edge[0], v = edge[1];
            graph.get(u).add(v);
            graph.get(v).add(u);
        }
        dfs(0, -1);
        dfs2(0, -1);
        return ans;
    }

    public void dfs(int u, int f) {
        sz[u] = 1;
        dp[u] = 0;
        for (int v: graph.get(u)) {
            if (v == f) {
                continue;
            }
            dfs(v, u);
            dp[u] += dp[v] + sz[v];
            sz[u] += sz[v];
        }
    }

    public void dfs2(int u, int f) {
        ans[u] = dp[u];
        for (int v: graph.get(u)) {
            if (v == f) {
                continue;
            }
            int pu = dp[u], pv = dp[v];
            int su = sz[u], sv = sz[v];

            dp[u] -= dp[v] + sz[v];
            sz[u] -= sz[v];
            dp[v] += dp[u] + sz[u];
            sz[v] += sz[u];

            dfs2(v, u);

            dp[u] = pu;
            dp[v] = pv;
            sz[u] = su;
            sz[v] = sv;
        }
    }
}

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-of-distances-in-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。文章来源地址https://www.toymoban.com/news/detail-571972.html

到了这里,关于OJ练习第138题——树中距离之和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每日OJ题_二叉树dfs②_力扣129. 求根节点到叶节点数字之和

    目录 力扣129. 求根节点到叶节点数字之和 解析代码 129. 求根节点到叶节点数字之和 难度 中等 给你一个二叉树的根节点  root  ,树中每个节点都存放有一个  0  到  9  之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径  1 - 2 - 3

    2024年02月21日
    浏览(34)
  • C++:OJ练习(每日练习系列)

    415. 字符串相加 - 力扣(LeetCode) 思路一: 第一步: 需要 获取字符串的两个尾节点下标 ; 第二步: 创建用于 记录进位数、获得的字符串的变量 ; 第三步: 只要 有进位或还有数没有加完继续循环 : 利用三目运算:有符号+符号,无符号+0 ; 第四步: 最后将得到的 字符串

    2024年02月05日
    浏览(23)
  • C++:OJ练习(每日练习系列)

    把字符串转换成整数_牛客题霸_牛客网 示例1 输入: 返回值: 思路一: 第一步: it从str的第一个字符开始遍历,定义一个最后输出的值你,以及判断结果正负的flag; 第二步:第一个为正则忽略,为负将flag改为负值; 第三步: 遍历字符串,遇到非字母直接退出,否则记录下

    2024年02月05日
    浏览(23)
  • 链表OJ练习(1)

    本题为力扣原题203 题目介绍: 给你一个链表的头节点  head  和一个整数  val  ,请你删除链表中所有满足  Node.val == val  的节点,并返回  新的头节点  。 列表中的节点数目范围在 0~10000内 1=Node.val=50 0=val=50   思路:利用双指针解决,struct ListNode*dst=NULL;struct ListNode*cur=he

    2024年02月10日
    浏览(22)
  • 链表OJ练习(2)

    题目介绍: 思路:创建两个链表,ghead尾插大于x的节点,lhead尾插小于x的节点。先遍历链表。最后将ghead尾插到lhead后面,将大小链表链接。           我们需要在创建两个链表指针,指向两个链表的头节点,用这两个指针标记lhead和ghead的尾结点,方便与尾插。 注:极端边

    2024年02月10日
    浏览(23)
  • 【C++】vector OJ练习

    这篇文章我们来做几道vector相关的OJ练习,练习一下vector的使用。。 题目链接: link 思路讲解 那这道题我们用 ^ 来搞是不是就非常简单啊。 两个相同的整数异或结果为0;0和任何整数异或结果还是这个数本身。 所以可以怎么搞, 定义一个变量初始值为0,遍历数组,让它和每

    2023年04月26日
    浏览(41)
  • 力扣练习——链表在线OJ

    目录 提示: 一、移除链表元素 题目: 解答: 二、反转链表 题目: 解答: 三、找到链表的中间结点 题目: 解答: 四、合并两个有序链表(经典) 题目: 解答: ①:接上一篇文章 本次我们来做一些在线OJ题,进一步加深印象和感觉,并且本次某些方法会沿用上一篇文章

    2024年02月08日
    浏览(39)
  • 数据结构——二叉树(OJ练习)

    大家好,本期是二叉树的最后一期,这一期我们来看看二叉树的编程题 . - 力扣(LeetCode) 首先我们的思路是: 遍历二叉树,把每个节点去比较一次,按照要求返回 我们来看代码 . - 力扣(LeetCode) 这里我们的思路是:同时遍历两给树,遇到空树或者不相等时返回。 . - 力扣

    2024年04月12日
    浏览(31)
  • OJ练习第85题——排列序列

    力扣链接:60. 排列序列 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: “123” “132” “213” “231” “312” “321” 给定 n 和 k,返回第 k 个排列。 示例 1: 输入:n = 3, k = 3 输出:“213” 示例 2:

    2024年02月01日
    浏览(18)
  • 【C语言练习】数组OJ题

    题目: 思路1: 数组是从0加到N,所以把0到N的数加起来减去数组中的值,结果就是消失的数字。时间复杂度为O(N) 代码: 思路2: 采用单身狗思路(异或法) 从0到N的值是依次加1,数组中消失的数字唯一出现一次,其他的数字都是成对出现 代码: 题目: 创建两个变量src和

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包