Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
给定一个二叉搜索树 root
和一个目标结果 k
,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true
。
示例 1:
5
/ \
3 6
/ \ \
2 4 7
输入: root = [5,3,6,2,4,null,7], k = 9
输出: true
二、思路分析
- 两数之和换了一种遍历方式,数据的载体换成了二叉搜索树。
- 使用哈希表将当前遍历到的值存入,使用目标值减去当前值,并将该值赋值给遍历target
- 在哈希表中查询target,如果target存在,则表示我们之前遍历到过该值,返回true
三、AC 代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func findTarget(root *TreeNode, k int) bool {
m := make(map[int]bool)
return dfs(root,m,k)
}
func dfs(node *TreeNode,m map[int]bool,k int) bool{
if node == nil {
return false
}
target := k - node.Val
if m[target] {
return true
}
m[node.Val] = true
return dfs(node.Left,m,k) || dfs(node.Right,m,k)
}
四、总结
本题与两数之和第一版本的区别是数据载体从数组换为了二叉树,更改遍历形式为dfs,结合哈希表,即可简单的找到是否有数据存在,在哈希表中存储遍历到的节点值,每次遍历计算当前值和目标值的差,就是我们要寻找的数。注意点:哈希表记录前就寻找目标值。