leetcode刷题-653两数之和

110 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

leetcode653-两数之和

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

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

输入: root = [5,3,6,2,4,null,7], k = 9
输出: true
输入: root = [5,3,6,2,4,null,7], k = 28
输出: false
输入: root = [2,1,3], k = 4
输出: true
输入: root = [2,1,3], k = 1
输出: false

解题思路分析

解法1

本解法是从二叉树各节点的数值出发,对于二叉树进行中序遍历。同时额外利用map进行数据的存储。当遍历到每个节点时,判断map中是否已经存储了该节点。如果已经存储了则表示存在对应节点满足需求,两数和为目标和。如果不存在,则用目标值减当前节点值,将结果存储map中。然后再继续对剩余节点进行遍历。如果遍历完整个二叉树都没有得到目标节点则为不存在。反之,在遍历途中遇到存在的情况则为存在,可结束递归遍历,直接返回存在的结果。

HashMap<Integer,Integer> map = new HashMap<>();
public boolean findTarget(TreeNode root, int k) {
    return spreadTree(root,k);
}

public boolean spreadTree(TreeNode node,int k){
    if(node == null){
        return false;
    }
    if(spreadTree(node.left,k)){
        return true;
    }
    if(map.containsKey(node.val)){
        return true;
    }else{
        map.put(k-node.val,1);
    }
    if(spreadTree(node.right,k)){
        return true;
    }
    return false;
}

复杂度分析

  • 时间复杂度:o(n)
  • 空间复杂度:o(n)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。