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

472 Concatenated Words

思路:将词典使用Trie树表示。对于输入的词word,在Trie树上找,当遇到一个isWord=true的节点,查看剩下部分的词是否在词典中。
例如输入 [“cat”,”cats”,”catsdogcats”,”dog”,”dogcatsdog”,”hippopotamuses”,”rat”,”ratcatdogcat”]
查找词cat:尽管cat是词,但是只有一个单词,不能加入结果。
查找词catsdogcats:发现cat是词,继续查找sdog…;发现以s开始的词不存在;返回上层查找cats是词,继续查找dog…。catsdogcats = cats+dog+cats。多一个字母,少一个字母都不是这样的组合。例如catsdogcatss=cats+dog+cats+s,s不在词典中,不能加入结果。
代码

124 Binary Tree Maximum Path Sum

思路:一棵树的路径可以是节点本身,也可以是具有父子关系的节点。例如Node(-10),其路径可以是Node(-10),也可以是Node(-10)->Node(9),还可以是Node(-10)->Node(20) ,还可以是Node(-10)->Node(20)。
图1图1
对于Node(n)我们知道n,如果我们知道Node(n)左右子节点的路径和,就可以求得以Node(n)为根节点的最大路径和是多少。max(n,leftSum,rightSum,n+leftSum,n+rightSum,n+leftSum+rightSum)。
接下来的问题是子节点的路径和怎么求?
如果是叶子节点,路径和就是Node的value。
如果是父节点,例如图1的Node(20),返回的路径和应该是20+15,因为 20+15>20+7 20 + 15 > 20 + 7
这里写图片描述图2
如果是图2的Node(-20),应该返回-20+15,这个值不是Node(-20)的最大路径和,但是是路径包含Node(-20)这个点最大的路径和。
这里写图片描述图3
如果是图3的节点Node(4)的左子树路径和是11+7=18,因为 11+7>11+2 11 + 7 > 11 + 2
注意:节点的路径一定是指节点经过其中左子树或者右子树的路径。

再说一下求在节点Node(n)最大路径和的计算式:max(n,leftSum,rightSum,n+leftSum,n+rightSum,n+leftSum+rightSum)。如果我们设一个全局变量maxValue记录每处理一个节点时候的路径和最大值。那么 maxValue>=leftSum m a x V a l u e >= l e f t S u m ,并且 maxValue>=rightSum m a x V a l u e >= r i g h t S u m ,这个是根据上面的描述得到的。所以leftSum,rightSum不需要参与比较。n+leftSum,n+rightSum,n+leftSum+rightSum是分别考虑了leftSum,rightSum为负数的情况。那么 n+leftSum=n+leftSum+0 n + l e f t S u m = n + l e f t S u m + 0 也就是认为rightSum=0。那么就可以取 n+Math.max(leftSum,0) n + M a t h . m a x ( l e f t S u m , 0 ) 简化表达式。对rightSum也同理。所以最后计算式变为max(n,n+Math.max(leftSum,0)+Max.max(rightSum,0))。
代码

99. Recover Binary Search Tree

思路:完全不知道怎么做。
学习:从页面知道了解法。中序遍历搜索二叉树,遍历的结果应该是一个升序序列。
这里写图片描述
上图这棵树的中序遍历结果是:1 2 3 4。
如果发现当前元素<前面的元素,则前面的元素需要换位置。
换到哪个位置呢?可能是当前位置,继续遍历,也可能是其他位置,但肯定是一个前元素<前面的元素的当前位置。
这里写图片描述
在中序遍历上图的时候,当访问到Node(2),前一个节点是Node(3), Node(2)<Node3 N o d e ( 2 ) < N o d e 3 ,则Node(3)需要换位置,暂时决定把Node(2)和Node(3) 换位置,记下firstElement=Node(3),secondElement=Node(2)。继续遍历,如果发现 < 当 前 节 点 < 前 面 的 节 点 ,则把secondElement=当前节点。
最后firstElement和secondElement交换位置(交换节点的值)。
代码

839 Similar String Groups

思路:首先写一个函数similar,判断两个字符串是否相似。其次,输入有n个字符串,每个字符串两两比较,相似的字符串放入一组。使用Union-Find实现。(代码
学习:用DFS的思路。处理元素A[i]:A[i]与其他元素比较。发现相似元素A[j],就继续使用A[j]去比较,一直比较完,同一组的元素比较完成。接着处理其他组的元素。学习网页链接。这个解法真的很棒。以前对于使用dfs,总是在主函数中调用一次就结束了。这个思路告诉我,一次dfs找到同一组元素。其次,文章中将比较过的A[i]=null,也很棒。以前标记是否访问过都会开辟boolean数组来实现。(代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值