[每日一题]113. Path Sum II
每日一题是一个每天刷leetcode群。x0a建群的目的在于每天讨论题目的解法,互相鼓励,提升水平。 x0a我们希望能从不同的角度去思考一个题目,举一反三!x0a通过做题提升算法水平。x0a一般是早上发题,晚上八点后讨论解法,贴代码。...
今天的题目其实跟昨天的题目的思路差不多。我总结了一下,有三种解法
- 深度优先搜索
- 递归
- 使用栈(stack + while)
深度优先搜索的思路很明确,就是从root 到left 遍历树,并且记下他的路径(使用path存储),到叶节点的时候,比较路径之和 和 sum(目标数)是否相等。具体代码如下:
上面的代码是ruby,无限接近伪代码,不会ruby的同学不要在意语法,知道意思就行。
使用dfs需要注意的是
- 在dfs方法返回前,需要将path中的最后一个元素弹出
- 应该在叶节点在判断是否记录结果
上面的代码居然打败了 100% 的Ruby提交~ 值得截图庆祝!
说明一个道理,我们在做完一道题目以后,一定要记得想想优化。一次简单的优化,说不定会带来极大的性能提升。
递归
本质上说,dfs也是递归,他们代码上也长的差不多。我以前一直认为是一个事情。今天写的时候,体会完全不一样。我发现递归跟dfs有一个非常大的不同是:递归不需要考虑path的增减问题。这是一个很关键的变化!因为递归的每一层,其实是不保存状态的!每一层的递归,程序的上下文都是全局状态。具体请看代码
在代码的28行,我将当前节点的val压入path以后,在30, 31行调用递归代码,我将数据clone了一份,这样的结果是下一层的path是完全不同的对象,我不需要再递归方法结束之后弹出最后一个值。
栈
一般情况下,能写成递归的程序都能写成循环:stack+ while 或者 foreach 。
不知道为什么,这段代码的性能反而比递归的代码性能差。有兴趣的伙伴可以参考着优化一下。
如下是@Kee 的swift 版本
@欣 的C++版本
@M.renard 的Java版本
@Armey郑兆奇 提供了一个Java的stack + while 版本。 我写了半天也没有写出来(原谅我的Java渣渣)。
具体代码就不解释了~
谢谢阅读
每日一题是一个每天刷leetcode群。
建群的目的在于每天讨论题目的解法,互相鼓励,提升水平。
我们希望能从不同的角度去思考一个题目,举一反三!
通过做题提升算法水平。
一般是早上发题,晚上八点后讨论解法,贴代码。
想刷题肉身翻墙的朋友加我微信进群 !
获取我微信号的办法
关注公众号,输入:我要刷题
关注 一个技术人员的胡言乱语
微信扫一扫关注公众号