返回

以质取胜,剖析力扣每日一题 0321:两数之和 IV

前端

导语

力扣每日一题系列是程序员提升算法技能的绝佳途径。第 0321 题——「两数之和 IV」——考查了我们在二叉搜索树中寻找特定和值的两个元素的技巧。本篇文章将深入剖析这道题目的解题过程,带你领略技术博客写作的魅力。

主体

题意解析

给定一棵二叉搜索树,目标是查找树中和为给定目标值的两棵不同的节点。二叉搜索树的性质是左子树中的所有值都小于根节点,而右子树中的所有值都大于根节点。

解题方法

为了解决这道题,有两种主要方法:

方法一:哈希表

  1. 创建一个哈希表,key 为树中的每个节点值,value 为指向该节点的指针。
  2. 从根节点开始,对树进行中序​​由此自上而下地访问节点。
  3. 在访问每个节点时,检查目标和减去当前节点值是否在哈希表中。
  4. 如果在哈希表中找到目标差值,则返回这两个节点。
  5. 继续中序​​搜索树,直到找到两个和为目标值的节点。

方法二:中序​​由此

  1. 对树进行中序​​由此,将节点值按从小到大存储在数组中。
  2. 使用双指针从数组两端向中间移动。
  3. 在移动指针时,计算两者的和。
  4. 如果和小于目标值,则向右移动右指针。
  5. 如果和小于目标值,则向左移动左指针。
  6. 如果和小于目标值,则返回这两个指针指向的节点。

代码实现

# 哈希表方法

def find_two_sum(root, k):
  hash_map = {}
  stack = [root]
  while stack:
    node = stack.pop()
    diff = k - node.val
    if diff in hash_map:
      return hash_map[diff], node
    else:
      hash_map[node.val] = node
      if node.left: stack.append(node.left)
      if node.right: stack.append(node.right)

# 中序​​由此方法

def find_two_sum(root, k):
  arr = []
  in_order(root, arr)

  left, right = 0, len(arr) - 1
  while left < right:
    sum = arr[left] + arr[right]
    if sum < k: left += 1
    elif sum > k: right -= 1
    else: return arr[left], arr[right]

时间复杂度

两种方法的时间复杂度均为 O(n),其中 n 是树中的节点数。

空间复杂度

哈希表方法的空间复杂度为 O(n),用于存储哈希表。中序​​由此方法的空间复杂度为 O(1),因为只需要一个数组来存储节点值。

总结

「两数之和 IV」是力扣每日一题系列中的一个经典题目。通过两种不同的解题方法,我们领略了使用哈希表和中序​​由此解决此类问题的精妙技巧。希望这篇技术博客文章能加深你对算法和数据结构的理解,助你在编程技能提升的道路上不断前行。

致谢

感谢力扣团队精心设置的每日一题系列,为广大程序员提供了一个磨练算法技能的绝佳平台。