剑指 Offer II 056. 二叉搜索树中两个节点之和【简单题】
思路:【递归】
递归中序遍历
BST
,将中序遍历的每个节点的值存入list
集合,最后得到的list
集合是一个递增的集合,遍历list
集合每一个元素,然后倒序遍历后边的元素,搜索是否有符合条件的情况。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean findTarget(TreeNode root, int k) {
List<Integer> list = new ArrayList<>();
dfs(root,list);
int size = list.size(), left = 0,right = size - 1;
while (left < size){
for (int i = right; i > left; i--) {
int sum = list.get(left) + list.get(i);
if (sum == k){
return true;
}else if (sum < k){
break;
}
}
left++;
}
return false;
}
public static void dfs(TreeNode root,List<Integer> list){
if (root == null){
return;
}
dfs(root.left,list);
list.add(root.val);
dfs(root.right,list);
}
}
剑指 Offer II 057. 值和下标之差都在给定的范围内【中等题】
思路:
将桶的大小定为
t + 1
,那么如果两个元素同属一个桶,则必然符合 元素差的绝对值小于等于t
这一条件;或者如果两个元素属于相邻桶,那么只要当前遍历到的元素与相邻桶中的元素 满足差的绝对值小于等于t
,也可满足 元素差的绝对值小于等于t
这一条件。 将遍历到的当前元素和其对应的桶id
存入map
,当i >= k
时,移除掉map
中id
为在数组nums
中 下标为中i - k
的元素对应的值,以求满足下标的差的绝对值小于等于k
。
代码:
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
int n = nums.length;
Map<Long,Long> map = new HashMap<>();
//根据 t 求出桶的宽度
long w = (long) t + 1;
//遍历数组中每个元素
for (int i = 0; i < n; i++) {
//获取当前元素的桶id
long id = getID(nums[i], w);
//如果 map 中 已经存在 当前 id 说明这个桶里 有 符合条件的元素,返回 true
if (map.containsKey(id)){
return true;
}
//如果 map 中 id 左侧的桶里有符合条件的元素 返回 true
if (map.containsKey(id-1) && Math.abs(nums[i]-map.get(id-1)) < w){
return true;
}
//如果 map 中 id 右侧的桶里有符合条件的元素 返回true
if (map.containsKey(id+1) && Math.abs(nums[i]-map.get(id+1)) < w){
return true;
}
//如果以上三种情况均不满足 则 将 当前元素及其对应的桶 id 放入 map 中
map.put(id,(long) nums[i]);
//将 map 中 下标比i小k的元素 对应的 id 删掉
if (i >= k){
map.remove(getID(nums[i-k], w));
}
}
return false;
}
/**
* 获取传入元素的桶id
* @param x 传入元素
* @param w 桶的宽度
* @return 桶id
*/
public static long getID(long x,long w){
if (x >= 0){
return x / w;
}
return (x + 1) / w - 1;
}
}