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

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的路径断开,得到下图。
节点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]+(Ncount[child]),因为我们已经得到answer[0]的正确结果,可以依据算式计算节点0的子节点的answer。算式中之所以使用count[child]来计算count[parent]:N−count[child])=count[prent]N - count[child])=count[prent]Ncount[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。
代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看虚拟机网卡命令

查看虚拟机网卡命令: dhclient转载于:https://www.cnblogs.com/xiaoshen666/p/10898404.html

[Leetcode][第216题][JAVA][数组之和3][回溯]

【问题描述】[中等] 【解答思路】 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer>> ans new LinkedList();public List<List<Integer>> combinationSum3(int k, int n) {dfs(0,k,0,n,1,new L…

第十三期:你不想错过的那些JSON工具

网上有许多出色的免费工具用于JSON格式化、验证、编辑以及转换成其他格式&#xff0c;可供开发人员选择。 作者&#xff1a;布加迪 JSON(JavaScript对象标注)是一种流行的轻量级数据交换格式&#xff0c;在网络上已很常见。 众所周知&#xff0c;JSON让开发人员易于使用&#…

java jvm学习

在并发编程中&#xff0c;多个线程之间采取什么机制进行通信&#xff08;信息交换&#xff09;&#xff0c;什么机制进行数据的同步&#xff1f; 在Java语言中&#xff0c;采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。 线程之间通过共享程序公共的状态&#…

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

广度优先搜索的定义 广度优先搜索BFS类似于树的层次遍历算法。基本思想是&#xff1a;首先访问顶点v&#xff0c;然后由v出发&#xff0c;依次访问v的各个未被访问过的顶点w1,w2,w3…wn。然后再访问wi(wi是w1,w2,w3…wn中的一个)未被访问过的邻接点。以此类推&#xff0c;直到所…

[Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

【问题描述】[中等] 【解答思路】 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Deque; import java.util.List;public class Solution {public List<List<Integer>> combinationSum2(int[] can…

java面试题11 牛客:如下语句通过算术运算和逻辑运算之后i和 j的结果是

如下语句通过算术运算和逻辑运算之后i和 j的结果是&#xff08; &#xff09; 1 2 3 4 5 6 int i0; int j0; if((i>0)||(j>0)) { //打印出i和j的值。 } A i0;j0 B i1;j1 C i0;j1 D i1;j0 懵逼树下懵逼果&#xff0c;懵逼树前你和我 逻辑运算符(Java中)有四类&…

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

743. Network Delay Time 输入&#xff1a;int[][] times times[i] new int[]{v,u,w} 表示从节点v到节点u需要时间w。注意这里是有向图。    int N 节点总数。    int k 起始节点 输出&#xff1a;从节点k到其他各个节点的最短路径和。如果有一个节点不能达到则返回-1。 …

负载均衡—几种常见算法

什么是负载均衡&#xff1f; 当一台服务器的性能达到极限时&#xff0c;我们可以使用服务器集群来提高网站的整体性能。那么&#xff0c;在服务器集群中&#xff0c;需要有一台服务器充当调度者的角色&#xff0c;用户的所有请求都会首先由它接收&#xff0c;调度者再根据每台服…

[Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

【问题描述】[中等] 【解答思路】 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {boolean flag false;int row board.length;int col board[0].length;boolean[][] used new boolean[row][col];for (int i 0; i <row ; i) {for …

java:彻底搞懂volatile关键字

对于volatile这个关键字&#xff0c;相信很多朋友都听说过&#xff0c;甚至使用过&#xff0c;这个关键字虽然字面上理解起来比较简单&#xff0c;但是要用好起来却不是一件容易的事。 这篇文章将从多个方面来讲解volatile&#xff0c;让你对它更加理解。 计算机中为什么会出现…

铃铛计数问题 解题报告

U72118 铃铛计数问题 对点我们发现有两种编号&#xff0c;一种是它本身的编号用作询问&#xff0c;一种是便于我们子树/链的操作的重新编号。 如果对链树剖作为第二编号&#xff0c;把点放到二维平面内&#xff0c;我们就可以用个kd-tree维护&#xff0c;需要支持一些加和询问之…

【Breadth-first Search 】513. Find Bottom Left Tree Value

输入&#xff1a;一颗二叉树 输出&#xff1a;这颗树的最下面一层最左边的节点值。 分析&#xff1a; 用BFS的思路解决最直观。读每一层&#xff0c;在每一层记录第一个元素的值。在队列中第一层&#xff1a;1&#xff1b;第二层&#xff1a;2&#xff0c;3&#xff1b;第三层…

Java:这是一份全面 详细的 Synchronized关键字 学习指南

前言 在Java中&#xff0c;有一个常被忽略 但 非常重要的关键字Synchronized今天&#xff0c;我将详细讲解 Java关键字Synchronized的所有知识&#xff0c;希望你们会喜欢目录 1. 定义 Java中的1个关键字 2. 作用 保证同一时刻最多只有1个线程执行 被Synchronized修饰的方法…

[Leetcode][第404题][JAVA][左叶子之和][DFS][BFS]

【问题描述】[简单] 【解答思路】 1. DFS 递进思想 一步一步递进 /先序遍历求所有节点值之和 public int sumOfTrees(TreeNode root) {if (root null) {return 0;}int leave root.val;int left sumOfTrees(root.left);int right sumOfTrees(root.right);return left ri…

01背包、完全背包、多重背包

参考&#xff08;都有些错误&#xff09;&#xff1a;https://github.com/guanjunjian/Interview-Summary/blob/master/notes/algorithms/%E7%BB%8F%E5%85%B8%E7%AE%97%E6%B3%95/01%E8%83%8C%E5%8C%85.mdhttps://blog.csdn.net/na_beginning/article/details/62884939 #include…

【Breadth-first Search 】515. Find Largest Value in Each Tree Row

输入&#xff1a;一颗二叉树 输出&#xff1a;这棵树每一层的最大值。 分析&#xff1a;和513 题目一样&#xff0c;处理层次问题&#xff0c;使用BFS最直观。使用和513一样的模板&#xff0c;只是记录下该层最大值即可。 分析2&#xff1a;用DFS处理层次遍历的问题&#xff0…

第十四期: 拥有7000多万店铺和10多亿件商品的微店如何打造AI系统?

AI技术对于电商至关重要&#xff0c;但AI的实践门槛很高&#xff0c;对于创业公司尤其如此。那么电商创业公司如何打造AI系统?如何利用AI解决实际问题? 作者&#xff1a;夏剑 AI技术对于电商至关重要&#xff0c;但AI的实践门槛很高&#xff0c;对于创业公司尤其如此。那么电…

【数据结构与算法】【算法思想】位图

位图BitMap 算法 public class BitMap { // Java中char类型占16bit&#xff0c;也即是2个字节private char[] bytes;private int nbits;//nbits 总容量public BitMap(int nbits) {this.nbits nbits;this.bytes new char[nbits/161];}//长度16 k/16 定位某一段 k%16定位段中某…

js 高阶函数之柯里化

博客地址&#xff1a;https://ainyi.com/74 定义 在计算机科学中&#xff0c;柯里化&#xff08;Currying&#xff09;是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数&#xff0c;并且返回接受余下的参数且返回结果的新函数的技术 就是只传递给函数…