一直很纠结算法的文章应该怎么写。最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来对吧。
我计划每题给出两种语言的解决方案,一种静态语言,一种动态语言。
我选择C语言,Python和Java作为实现语言,由于篇幅有限,其他语言的实现有兴趣的朋友请自己尝试。
LeetCode 653. 两数之和 IV - 输入 BST(Two Sum IV - Input is a BST)
问题描述:
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
示例:
C语言实现:
两个节点的值的和要等于target,即两个节点都要在BST中。那么我们就可以得出这样的解题思路:当遍历到某个节点n的时候,检查BST中是否有节点的值满足target-n.val,如果存在,返回true,否则返回false。
C实现的代码如下:
代码18行,调用函数isContain来检查整个BST是否存在值是k – cur->val的的节点。isContain实现的是BST搜索函数,如果找到返回true,否则返回false。在isContain函数中要避免找到的节点是当前节点自身,这就是isContain的第二个参数的用途。举个例子,
如果BST是[1,3],target是2,那么应该返回false的,如果isContain不检查cur的话,会返回true,这是错误的。
代码19行,对左右子树递归查找。
时间复杂度。_findTarget函数的递归的时间复杂度是O(n),且每次都会调用isContain函数,而isContain函数的时间复杂度是O(logn),所以总的时间复杂度是O(nlogn)。
python语言的实现:
相对于C语言的实现,python的实现我们对查找做了一些优化,不用每次都查找整个BST,我们可以在类中定义一个set变量s,当我们遍历到一个节点n的时候,如果我们发现s中不存在k-n.val的时候,我们就将n.val添加到s中,否则返回true。
这样查找的时间复杂度将降到O(1)。使得总的时间复杂度可以在O(n)内完成。
代码如下:
Java语言的实现:
Java的实现和python语言的实现基本相同。
代码如下: