834 Sum of Distances in Tree

思路:一颗无向的树有N个节点,分别标记为0,1,2,…N-1,有若干条边。结果返回每个节点到其他节点的路径和。

以上面这棵树为例。从节点0到其他点的路径查找过程是:节点0有两条边分别到达子节点1和子节点2;递归查找节点1(节点1没有子节点),节点2;继续查找节点2的子节点…依次下去。递归每进一层,路径就需要加1。
遍历完节点0以后,再以节点1为根节点,遍历。
时间复杂度O(N*E),E是边的数目。这个思路超时。既然是超时,定是因为有重复计算的。例如遍历边(0,2),之后又遍历了一次(2,0)。但是该怎么合并计算,我没想出来。
学习:接下来的描述,相当于翻译官方解释吧。

用一颗新的树为例子。节点0和节点4是父子关系,也是相邻节点。现在观察一下相邻节点连接后,路径和发生什么变化。
将节点0和节点4的路径断开,得到下图。

记:stsum[0] 表示节点0在节点0子树上的路径和。stsum[4]表示节点4在节点4子树上的路径和。count[0]表示节点0子树的节点数。answer[0]表示节点0在整个树的路径和。answer[4]表示节点4在整个树的路径和。

当节点0和节点4之间加上路径后,answer[0]= stsum[0] + stsum[4] + count[4]。因为节点0到节点4子树上所有点的距离与节点4到节点4子树上所有点的距离都要加1。answer[4]= stsum[4] + stsum[0] + count[0]。而且能得到answer[0]-answer[4]=count[4]-count[0]。

所以得到结论:相邻节点(父子节点)x,y在整个树的路径和是:answer[x]−answer[y]=count[y]−count[x]answer[x] -answer[y] = count[y] - count[x]answer[x]−answer[y]=count[y]−count[x]。
编码过程:
1 answer[]存储以每个节点为根节点在整个树的路径和;
2 count[] 存储以每个节点为根节点的子树的节点数,初始化每个元素值=1;
3 对某个节点node,dfs后序遍历,先处理子节点,计算每个子节点y的count和stsum,count[node]+=count[child]count[node]+=count[child]count[node]+=count[child],stsum[node]+=stsum[child]+count[child]stsum[node] +=stsum[child]+count[child]stsum[node]+=stsum[child]+count[child],当遍历了所有的边以后answer[node]=stsum[node]answer[node] = stsum[node]answer[node]=stsum[node];如果我们从节点0开始遍历。这次遍历结束后只有answer[0]是正确的。其他节点都没有遍历完全。
4 再看,上面分析了两个相邻节点(父子节点)的路径和关系。如果有节点parent和子节点child,则有answer[child]=answer[parent]−count[child]+(N−count[child])answer[child] = answer[parent] - count[child] + (N - count[child])answer[child]=answer[parent]−count[child]+(N−count[child]),因为我们已经得到answer[0]的正确结果,可以依据算式计算节点0的子节点的answer。算式中之所以使用count[child]来计算count[parent]:N−count[child])=count[prent]N - count[child])=count[prent]N−count[child])=count[prent],是因为在上一步的后续遍历过程中,count[parent]的值已经发生变化,不再是parent、child状态下的count
(原文的解释是:count[child]从child得到parent比较容易)。用先序遍历再次遍历树,修改每个子节点的answer,得到最终结果。
代码

301 Remove Invalid Parentheses

思路:最直接的想法:把s中每一个(,)去掉,检查新的字符串是不是有效字符串,如果是则加入到结果集。
这样不符合题意的要求:去掉最少的括号。那么需要计算最少去掉几个左括号,去掉几个右括号,就可以是有效字符串。
在编码过程中注意去重。
代码
学习:可以改进,不再需要判断是否是有效字符串。添加变量open。有效字符的特征是:左括号在前,所以open>0;左右括号个数相同=>open=0;多余的左右括号都去掉了=>leftCount=0 and rightCount=0。
代码

Depth-first Search深度优先搜索专题7相关推荐

  1. Depth-first Search深度优先搜索专题1

    104. Maximum Depth of Binary Tree 思路:顺着树的一个分支一直数层数直到叶子节点.DFS的思路.这个题目可以练习的是递归转迭代. 代码 695. Max Area of ...

  2. Depth-first Search深度优先搜索专题6

    472 Concatenated Words 思路:将词典使用Trie树表示.对于输入的词word,在Trie树上找,当遇到一个isWord=true的节点,查看剩下部分的词是否在词典中. 例如输入 ...

  3. Depth-first Search深度优先搜索专题4

    576. Out of Boundary Paths 思路:这道题目难倒了我.最直接的思路是暴力搜索.要注意的问题1是需要仔细观察Example2,轨迹不同意思是可以从A点到B点,再从B点到A点也可以 ...

  4. Depth-first Search深度优先搜索专题2

    199. Binary Tree Right Side View 思路:想要得到树的每一层最右侧元素值,用BFS最方便.先访问左节点再访问右节点,最后访问的一个值就是留下的值. 想要DFS的思路也可以 ...

  5. Depth-first Search深度优先搜索专题3

    473. Matchsticks to Square 思路:有n根长度不一的火柴,这些火柴可以拼接在一起,但不能被折断.这些火柴能够围城一个正方形吗?每个火柴可以并且必须使用一次.分析得到每个边的长度 ...

  6. Depth-first Search深度优先搜索专题5

    329. Longest Increasing Path in a Matrix 思路:计算某个位置i,j,最长路径的长度.计算长度的条件是:如果i,j的相邻位置newi,newj不能出matrix的 ...

  7. JavaScript实现depth First Search深度优先搜索算法(附完整源码)

    JavaScript实现depth First Search深度优先搜索算法(附完整源码) depthFirstSearch.js完整源代码 depthFirstSearch.js完整源代码 func ...

  8. Breadth-first Search(广度优先搜索)专题1

    广度优先搜索的定义 广度优先搜索BFS类似于树的层次遍历算法.基本思想是:首先访问顶点v,然后由v出发,依次访问v的各个未被访问过的顶点w1,w2,w3-wn.然后再访问wi(wi是w1,w2,w3- ...

  9. Breadth-first Search(广度优先搜索)专题2

    743. Network Delay Time 输入:int[][] times times[i]= new int[]{v,u,w} 表示从节点v到节点u需要时间w.注意这里是有向图. int N ...

最新文章

  1. MySQL中DATE_FORMATE函数内置字符集解析
  2. JavaScript 入门基础 (八)
  3. MATLAB 结构型变量
  4. ProtoBuf协议
  5. 【行业】点餐App未来必须面对的三大难题
  6. 10 windows 启动虚拟机报错_Windows 系统如何安装 Docker
  7. Python 网络爬虫的常用库汇总
  8. linux 定时java程序,Linux操作系统上定时运行Java程序的方法
  9. VMware ESXi/ESX 的内部版本号和版本 (2143832)-2020-10-27更新
  10. 五、stdout,stdoin和stderr
  11. 安全狗云备份爆笑段子~~~如果上天再给我一次机会
  12. Linux DRM KMS 驱动简介
  13. Oracle用户及角色的权限管理[Oracle基础]
  14. 牛客网 吉首大学2019年程序设计竞赛(重现赛)A: SARS病毒(矩阵快速幂 + 碰巧降幂)
  15. Linux上搭建ElasticSearch-8.x集群以及安装Kibana(保姆级安装教程)
  16. 扑克牌游戏“快算24”算法
  17. 怎么访问云服务器上的图片
  18. Uva11500-Gambler's ruin
  19. 【教程】美团联盟个人怎么注册推广做外卖cps红包
  20. 人工智能基础部分11-图像识别实战(网络层联想记忆,代码解读)

热门文章

  1. Streaming 101
  2. msfconsole 无法启动,解决办法
  3. hihoCoder 1116 计算 (线段树)
  4. android中常见的回调模式
  5. 状压动规_(POJ2817)
  6. java 实现 常见排序算法(四)基数排序
  7. 传统ELK分布式日志收集的缺点?
  8. mongoose 更新元素 DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany
  9. centos7 greenplum6.1开源版本编译
  10. 使用ArrayList时设置初始容量的重要性