834. 树中距离之和

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

第 i 条边连接节点 edges[i][0] 和 edges[i][1] 。

返回一个表示节点 i 与其他所有节点距离之和的列表 ans。

示例 1:

输入: N = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]]

输出: [8,12,6,10,10,10]

解释:

如下为给定的树的示意图:

0

/

1 2

/|

3 4 5

我们可以计算出 dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5)

也就是 1 + 1 + 2 + 2 + 2 = 8。 因此,answer[0] = 8,以此类推。

说明: 1 <= N <= 10000

PS:

这个题看了半个小时没找到思路,只能去看题解,原来我的菜

class Solution {
//这个题我看了半天,怎么看怎么超时,原来是中间有规律,该说不说,这个规律真的难找
int[] ans, count;
List<Set<Integer>> graph;
int N;
public int[] sumOfDistancesInTree(int N, int[][] edges) {
this.N = N;
graph = new ArrayList<Set<Integer>>();
ans = new int[N];
count = new int[N];
Arrays.fill(count, 1); for (int i = 0; i < N; ++i)
graph.add(new HashSet<Integer>());
for (int[] edge: edges) {
graph.get(edge[0]).add(edge[1]);
graph.get(edge[1]).add(edge[0]);
}
dfs(0, -1);
dfs2(0, -1);
return ans;
} public void dfs(int node, int parent) {
for (int child: graph.get(node))
if (child != parent) {
dfs(child, node);
//count[node]是以node为根的节点个数
count[node] += count[child];
//ans[node]是所有结点道node的距离
//就是ans[child]+child与node的距离
ans[node] += ans[child] + count[child];
}
} public void dfs2(int node, int parent) {
for (int child: graph.get(node))
if (child != parent) {
// ans[node] += ans[child] + count[child];
//这是ans[child]的前半部分,
//后半部分是,不是以child为根的节点个数
//后半部分是,因为,我们可以发现,每一个count都是多加了自己本身的,
//也就是我们前面的child是多加了自己本身的,所以不是child的根节点都没加上
ans[child] = ans[node] - count[child] + N - count[child];
dfs2(child, node);
}
} }

最新文章

  1. mstsc 远程序桌面登录的 c#开发
  2. C和指针 第七章 习题
  3. 【Flex】正则表达式
  4. HQL 参数绑定、唯一结果、分页、投影总结(下)
  5. ListView去除顶部和底部边缘阴影(亲测4.4及以前的版本都适用)
  6. iOS开发——网络Swift篇&amp;NSURL进行数据请求(POST与GET)
  7. ie8下jquery读取当前点击的标签位置错误,原因是里面有内容写了text-indent:-9999px
  8. 如何彻底删除SVN中的文件和文件夹(附恢复方法)
  9. web前端技术归类
  10. java线程API学习 线程池ThreadPoolExecutor(转)
  11. AWS-SS配置过程
  12. Scoping the Project for iOS 7
  13. Cloesest Common Ancestors
  14. 【转】js程序中美元符号$是什么
  15. nginx第三方库安装以及连接memcache
  16. POJ1459 Power Network 网络流 最大流
  17. mysql常用查询语句
  18. MySQL GTID你知多少【转】
  19. Android GUI之View事件处理
  20. 【工具】代码生成器-python脚本

热门文章

  1. 201771010113 李婷华 《面向对象程序设计(Java)》第八周总结
  2. js中刷新页面的方式总结
  3. STM32 基于 CubeMX配置GPIO点亮LED灯(超级详细+图文并茂)
  4. FPGA代码优化方法和准则
  5. MOS管、PCB、H桥、步进电机驱动电路、51单片机的IO口驱动能力、灌电流、拉电流、上拉电阻的选择
  6. 设计模式之GOF23外观模式
  7. 第六次java上机作业
  8. 手写一个简易的多周期 MIPS CPU
  9. Android 仿百度手机助手首页滑动效果
  10. webpack指南(四)shimming