溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode Easy653中兩數之和輸入為BST的示例分析

發布時間:2021-09-17 15:59:37 來源:億速云 閱讀:155 作者:柒染 欄目:編程語言
# LeetCode Easy653中兩數之和輸入為BST的示例分析

## 問題描述回顧

LeetCode第653題"Two Sum IV - Input is a BST"題目描述如下:

給定一個二叉搜索樹(BST)和一個目標數值`k`,判斷BST中是否存在兩個節點,其節點值之和等于給定的`k`。

示例1:

輸入: 5 /
3 6 / \
2 4 7 k = 9 輸出: true


示例2:

輸入: 5 /
3 6 / \
2 4 7 k = 28 輸出: false


## 解題思路分析

### 方法一:哈希表輔助的中序遍歷

**核心思想**:利用BST中序遍歷的有序性,結合哈希表記錄已訪問節點值。

```python
def findTarget(root, k):
    visited = set()
    stack = []
    curr = root
    
    while curr or stack:
        while curr:
            stack.append(curr)
            curr = curr.left
        curr = stack.pop()
        if k - curr.val in visited:
            return True
        visited.add(curr.val)
        curr = curr.right
    return False

時間復雜度:O(n),每個節點訪問一次
空間復雜度:O(n),最壞情況存儲所有節點值

方法二:雙指針法

實現步驟: 1. 中序遍歷得到有序數組 2. 使用雙指針在有序數組中查找兩數之和

def findTarget(root, k):
    nums = []
    def inorder(node):
        if not node: return
        inorder(node.left)
        nums.append(node.val)
        inorder(node.right)
    
    inorder(root)
    left, right = 0, len(nums)-1
    while left < right:
        total = nums[left] + nums[right]
        if total == k:
            return True
        elif total < k:
            left += 1
        else:
            right -= 1
    return False

時間復雜度:O(n)中序遍歷 + O(n)雙指針 = O(n)
空間復雜度:O(n)存儲中序序列

關鍵測試用例分析

常規測試用例

# 用例1:存在解
"""
    5
   / \
  3   6
 / \   \
2   4   7
"""
root1 = TreeNode(5)
root1.left = TreeNode(3)
root1.right = TreeNode(6)
root1.left.left = TreeNode(2)
root1.left.right = TreeNode(4)
root1.right.right = TreeNode(7)
assert findTarget(root1, 9) == True

# 用例2:無解
assert findTarget(root1, 28) == False

邊界測試用例

# 用例3:空樹
assert findTarget(None, 0) == False

# 用例4:單節點樹
root2 = TreeNode(1)
assert findTarget(root2, 1) == False

# 用例5:重復值情況
"""
    2
   / \
  1   2
"""
root3 = TreeNode(2)
root3.left = TreeNode(1)
root3.right = TreeNode(2)
assert findTarget(root3, 4) == True

算法優化探討

方法三:BST特性優化搜索

利用BST的搜索特性,對每個節點x,在BST中搜索k-x

def findTarget(root, k):
    def search(node, target):
        if not node: return False
        if node.val == target: return True
        return search(node.left, target) if target < node.val else search(node.right, target)
    
    def dfs(node):
        if not node: return False
        if search(root, k - node.val) and (k - node.val) != node.val:
            return True
        return dfs(node.left) or dfs(node.right)
    
    return dfs(root)

時間復雜度分析
最壞情況O(nlogn)(平衡BST)到O(n2)(退化成鏈表)
適用場景:當BST高度較低時效率較高

不同語言實現對比

Java實現示例

// 哈希表法
public boolean findTarget(TreeNode root, int k) {
    Set<Integer> set = new HashSet<>();
    return find(root, k, set);
}

private boolean find(TreeNode node, int k, Set<Integer> set) {
    if (node == null) return false;
    if (set.contains(k - node.val)) return true;
    set.add(node.val);
    return find(node.left, k, set) || find(node.right, k, set);
}

C++實現特點

// 雙指針法
bool findTarget(TreeNode* root, int k) {
    vector<int> nums;
    inorder(root, nums);
    int left = 0, right = nums.size()-1;
    while (left < right) {
        int sum = nums[left] + nums[right];
        if (sum == k) return true;
        sum < k ? left++ : right--;
    }
    return false;
}

void inorder(TreeNode* node, vector<int>& nums) {
    if (!node) return;
    inorder(node->left, nums);
    nums.push_back(node->val);
    inorder(node->right, nums);
}

實際工程應用

應用場景示例

  1. 會員系統:查找用戶消費記錄中是否存在兩筆交易金額之和等于特定值
  2. 庫存管理:檢查是否存在兩種商品價格組合滿足促銷條件
  3. 金融風控:監測是否存在異常資金拆分組合

工程實現建議

  1. 大數據量處理:對于超大規模BST,考慮分塊加載+外部排序
  2. 并發查詢:對只讀BST可實現多線程并行搜索
  3. 持久化優化:對頻繁查詢場景可預計算并緩存所有可能的和值

擴展思考

問題變種

  1. 三數之和:如何擴展算法解決三數之和問題?
  2. 最近似解:當無精確解時,如何找到最接近的和?
  3. 多樹查詢:如果輸入是多個BST,如何高效處理?

進階挑戰

# 找出所有可能的解對
def findAllPairs(root, k):
    res = []
    visited = set()
    
    def traverse(node):
        if not node: return
        if k - node.val in visited:
            res.append([k-node.val, node.val])
        visited.add(node.val)
        traverse(node.left)
        traverse(node.right)
    
    traverse(root)
    return res

總結

本文詳細分析了LeetCode 653題的多種解法,通過BST的特性優化算法效率。關鍵要點包括:

  1. 哈希表法具有最優的平均時間復雜度O(n)
  2. 雙指針法利用有序性減少空間復雜度
  3. 實際工程中需根據數據特征選擇合適算法
  4. BST的結構特性是算法優化的關鍵

最終建議:在面試場景推薦使用哈希表法,因其實現簡潔且時間復雜度穩定;在內存敏感環境可考慮雙指針法。


本文共計約2150字,通過多種代碼示例和詳細分析,全面解析了BST中兩數之和問題的解決方案。讀者可根據實際需求選擇適合的算法實現。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女