653. 两数之和 IV - 输入 BST(dfs + 二分搜索 or 双指针)

280 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

每日刷题第70天 2021.03.21

653. 两数之和 IV - 输入 BST

题目描述

  • 给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true

解题思路

  • 使用dfs将二分搜索树的节点,前序遍历到一个数组ans
  • sort函数,对ans数组排序。js中的sort()函数对负数的排序也管用
    • 注意:sort函数,如果写了function()一定要写return
  • 排序好的ans数组,就可以联想到两数之和那道题,使用二分搜索
  • 因为这道题的两数均不知道,因此需要一个外层的for循环来枚举可以作为需要被减去的第一个数,剩下的需要查找的第二个数记为target
    • 还需要判断两种情况:1.两个数是否为同一个数;2.找到的数是否等于target,因为当数组中不存在与target相等的数的时候,其有可能是小于target的数
    • 找到符合的就返回true,如果遍历完整个数组都没有找到,那么就返回false

⚠️注意事项⚠️

  • for循环遍历,需要注意每轮要初始化的变量
  • sort函数,箭头函数形式,一定要写return

AC代码

var findTarget = function(root, k) {
  // 二叉搜索树:对于每一个节点,其右节点都要小于根节点,其左节点都要大于根节点
  // 减去当前的值
  // 先将其转换成一串数,再去判断是否有两数加和为其
  // 转换为两数加和的问题,二分查找
  let ans = [];
  function dfs(node) {
    if(node == null) return;
    ans.push(node.val);
    dfs(node.left);
    dfs(node.right);
  }
  dfs(root);
  // console.log(ans)
  // 二分查找
  ans.sort((a,b) => {
    return a - b;
  });
  // console.log(ans)
  let len = ans.length;
  let l = -1,r = len,target = 0;
  for(i = 0; i < len; i++) {
    target = k - ans[i];
    // console.log('target:',target)
    l = -1,r = len;
    while(l + 1 != r) {
      let mid = l + parseInt((r - l) / 2);
      if(ans[mid] <= target){
        l = mid;
      }else if(ans[mid] > target){
        r = mid;
      }
    }
    // console.log('l',l,ans[l])
    if(l != i && ans[l] == target) return true;
  }
  return false;
};

总结

  • 写完代码提交的时候,要多思考🤔,初始化的变量是否都已经处理好,排序的函数是否已经写好。