834. Sum of Distances in Tree —— weekly contest 84
2024-08-25 22:35:01
Sum of Distances in Tree
An undirected, connected tree with N
nodes labelled 0...N-1
and N-1
edges
are given.
The i
th edge connects nodes edges[i][0]
and edges[i][1]
together.
Return a list ans
, where ans[i]
is the sum of the distances between node i
and all other nodes.
Example 1:
Input: N = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]]
Output: [8,12,6,10,10,10]
Explanation:
Here is a diagram of the given tree:
0
/ \
1 2
/|\
3 4 5
We can see that dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5)
equals 1 + 1 + 2 + 2 + 2 = 8. Hence, answer[0] = 8, and so on.
Note: 1 <= N <= 10000
1 class Solution {
2 public:
3 //相当于图来存来处理
4 vector<vector<int>> tree;
5 vector<int> res;
6 vector<int> subc;
7 int n;
8 vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {
9 //tree.rvec(N,vector<int>(N));
10 //init
11 n = N;
12 tree.resize(N); //初始化的函数
13 res.assign(N,0);
14 subc.assign(N,0);
15 //build tree
16 for(auto e : edges){ //遍历的技巧
17 tree[e[0]].push_back(e[1]);
18 tree[e[1]].push_back(e[0]);
19 }
20 set<int> visited1;
21 set<int> visited2;
22 DFS_POST(0,visited1); //初始root任何值都行
23 DFS_PRE(0,visited2);
24 return res;
25
26 }
27 void DFS_POST(int root,set<int> &visited){ //传引用保存修改值
28 visited.insert(root);
29 for(auto i : tree[root]){
30 if(visited.find(i) == visited.end() ){
31 DFS_POST(i,visited);
32 subc[root] += subc[i];
33 res[root] += res[i] + subc[i];
34 }
35 }
36 subc[root]++; //加上自身节点
37 }
38 void DFS_PRE(int root,set<int> &visited){
39 visited.insert(root);
40 for(auto i : tree[root]){
41 if(visited.find(i) == visited.end()){
42 res[i] = res[root] - subc[i] + n - subc[i]; //算法核心
43 DFS_PRE(i,visited);
44 }
45 }
46 }
47
48 };
主要函数是初始化的函数。
主要算法思想是先序和后续的递归遍历(DFS)。
实现O(n2)的算法核心方程是:res[i] = res[root] - subc[i] + n - subc[i];
最新文章
- ssh 登录慢?
- HDMI之CEC DDC学习笔记(可能有误)
- 禁用CMFCRibbonApplicationButton的单击和双击事件
- iOS开发——项目篇—高仿百思不得姐 05——发布界面、发表文字界面、重识 bounds、frame、scrollView
- java实现按拼音排序名称
- 精通ASP.Net MVC 3 框架(第三版)学习笔记
- 运用CMD命令关于快速获取文件夹名称和快速建立文件夹
- CSS3秘笈第三版涵盖HTML5学习笔记1~5章
- Starting and Stopping Oracle Fusion Middleware
- Effective Java提升Code Coverage代码涵盖率 - 就是爱Java
- php中的short_open_tag的作用
- Linux 下Nginx 的安装及负载均衡的简单配置
- SQL查询一个表里面某个字段值相同的数据记录
- php 制作圆形图片
- Tampermonkey-让百度云下载飞起来
- Cucumber使用中问题
- JAVAWEB 一一 fmt标签 和日期插件
- 记录:Ubuntu 18.04 安装 tensorflow-gpu 版本
- MySQL备份与还原详细过程示例
- overloading与overriding的区别
热门文章
- Layman 使用ffmpeg-php扩展库实现视频截图(默认图)
- 如何学习iOS开发?iOS Developer Library足矣!
- 040 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 02 while循环的执行流程
- 二进制K8S集群使用Bootstrap Token 方式增加Node
- 通过VNC远程连接Linux实例
- 机器学习算法——kNN(k-近邻算法)
- TiOps,支持容器,支持多云安全远程运维,疫情期间免费开放,助力远程办公
- 自定义 Spring Boot Starter
- Nuxt+Vue聊天室|nuxt仿微信App界面|nuxt.js聊天实例
- map的key排序