Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
每日刷题第70天 2021.03.21
653. 两数之和 IV - 输入 BST
- leetcode原题链接:leetcode-cn.com/problems/tw…
- 难度:简单
- 方法:dfs+二分 or 双指针
题目描述
- 给定一个二叉搜索树
root和一个目标结果k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回true。
解题思路
- 使用
dfs将二分搜索树的节点,前序遍历到一个数组ans中 sort函数,对ans数组排序。js中的sort()函数对负数的排序也管用- 注意:
sort函数,如果写了function()一定要写return
- 注意:
- 排序好的
ans数组,就可以联想到两数之和那道题,使用二分搜索 - 因为这道题的两数均不知道,因此需要一个外层的
for循环来枚举可以作为需要被减去的第一个数,剩下的需要查找的第二个数记为target- 还需要判断两种情况:1.两个数是否为同一个数;2.找到的数是否等于
target,因为当数组中不存在与target相等的数的时候,其有可能是小于target的数 - 找到符合的就返回
true,如果遍历完整个数组都没有找到,那么就返回false
- 还需要判断两种情况:1.两个数是否为同一个数;2.找到的数是否等于
⚠️注意事项⚠️
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;
};
总结
- 写完代码提交的时候,要多思考🤔,初始化的变量是否都已经处理好,排序的函数是否已经写好。