java数据结构与算法刷题-----LeetCode653. 两数之和 IV - 输入二叉搜索树

news/2024/7/20 20:20:23 标签: java, 深度优先, leetcode, 算法
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 前序遍历加hash
    • 2. 中序遍历+双指针

在这里插入图片描述

1. 前序遍历加hash

解题思路:时间复杂度O(n),空间复杂度O(n)
  1. 使用hash表存储每个结点值
  2. 每次遍历新结点时,查找hash表是否包含一个数a,和当前结点的值b能组成目标值target
代码:使用编程语言自带的hash表,因为健壮性考虑,这些处理会需要额外的时间开销,所以耗时会多一点

在这里插入图片描述

java">class Solution {
    Set<Integer> set = new HashSet<Integer>();

    public boolean findTarget(TreeNode root, int k) {
        if (root == null) return false;
        //如果hash表中包含k - val的差值,则说明hash表中有val的补数,说明有两个值符合条件
        if (set.contains(k - root.val)) return true;
        //否则将val放入hash表
        set.add(root.val);
        //然后遍历左子树,最后右子树
        return findTarget(root.left, k) || findTarget(root.right, k);
    }
}

2. 中序遍历+双指针

解题思路:时间复杂度O(n),空间复杂度O(n)
  1. 因为是二叉搜索树,中序遍历结果正好是一个有序的升序序列
  2. 先获取中序遍历结果,然后使用双指针找目标值
  3. 左右两边之和a,如果a小于目标值target,则left++,如果a大于target,则right–
代码

在这里插入图片描述

java">class Solution {
    public boolean findTarget(TreeNode root, int k) {
        ArrayList<Integer> list = new ArrayList<Integer>();//保存中序遍历结果
        dfs(root,list);//中序遍历
        //双指针,左右两边依次移动找k
        int left = 0,right = list.size()-1;
        while(left<right){
            int num = list.get(left)+list.get(right);
            if(num == k) return true;
            else if(num < k)left++;//如果左右之和<k,则值太小,需要增大,left++
            else right--;//否则说明num太大,需要缩小,right--
        }
        return false;
    }
    public void dfs(TreeNode root , ArrayList<Integer> list){
        if(root == null) return;
        dfs(root.left,list);
        list.add(root.val);
        dfs(root.right,list);
    }
}

http://www.niftyadmin.cn/n/5411986.html

相关文章

Jackson 自定义序列化/反序列化,处理java.sql.Time

Jackson 只提供了针对 java.sql.Time序列化工具&#xff0c;没有提供反序列化&#xff0c;从而导致在反序列化时报错&#xff1a; aused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of java.sql.Time (no Creators, like…

【CSP考点回顾】前缀和数组

一、一维数组前缀和 前缀和算法是一种用于处理数组的技术&#xff0c;它可以快速计算任何连续子数组的和。适合在多次查询中需要求解多个范围和的情况。使用前缀和算法可以将每次求和的时间复杂度从 O(n) 降低到 O(1)。 前缀和的思想是创建一个新数组 A r r Arr Arr&#xff0…

前端将html导出pdf文件解决分页问题

这是借鉴了qq_251025116大佬的解决方案并优化升级完成的&#xff0c;原文链接 1.安装依赖 npm install jspdf html2canvas2.使用方法 import htmlToPdffrom ./index.jsconst suc () > {message.success(success);};//记得在需要打印的div上面添加 idlet dom document.que…

08---SD卡-TF卡硬件电路设计

视频链接 SD卡硬件电路设计01_哔哩哔哩_bilibili SD卡-TF卡硬件电路设计 1、定义 SD卡(Secure Digital Memory Card)是一种基于半导体快闪记忆器的新一代记忆设备。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。SD卡按尺寸分类可分为三类:标准SD卡、Min…

UnityAPI的学习——Matrix4x4类

在脚本中通常用Vector3、Quaternion、Transform等类的属性和方法来对物体进行交换&#xff0c;Matrix4x4类通常用在一些比较特殊的地方&#xff0c;如对摄像机的非标准投影变换。 Matrix4x4类实例方法 在Matrix4x4类中&#xff0c;涉及的实例方法有MultiplyPoint方法、Multip…

基于redis实现用户登陆

因为session有数据共享问题&#xff0c;不同tomcat服务器中的session不能共享&#xff0c;之后负载均衡就无法实现。所以我们用redis代替session。redis可以被多个tomcat服务器共享&#xff0c;redis基于内存。 之前的session可以看做登陆凭证&#xff0c;本次登陆凭证由sessi…

ROS从入门到精通4-2:Docker安装ROS、可视化仿真与终端复用

目录 0 专栏介绍1 Docker安装ROS2 Docker可视化仿真2.1 显示配置2.2 启动容器 3 终端复用工具3.1 session操作3.2 window操作3.3 pane操作3.4 其他操作 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0c;掌握ROS底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS…

rust-analyzer报错“Failed to spawn one or more proc-macro servers,....“怎么解决?

最近,在使用vscode测试rust代码时,遇到了一些问题。在经过反复折腾后,最终解决了问题,在此写下作为记录,以便于以后参考。 我遇到的报错内容是: Failed to spawn one or more proc-macro servers. cannot find proc-macro-srv, the workspace E:\100rust\temp is missin…