![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法Note
文章平均质量分 79
个人学习算法过程中的笔记,主要参考《代码随想录》
LiQiang33
这个作者很懒,什么都没留下…
展开
-
LC3-中-无重复字符的最长子串
既然不知道开始和结束的位置,使用滑动窗口不断试探开始和结束,然后取其中最大的,这样时间复杂度就降下来了,时间复杂度O(n)最长无重复子串的长度,确定这个子串,长度自然就知道了,难点就是不知道这个字符串的开始和结束在什么位置。【注意】每次字符长度不能增加时,说明遇到相同的字符,此时从开始的地方逐步错小滑动窗口的大小。当然暴力的解法在LeetCode中是Timeout的,因此需要对算法优化。最开始就是暴力循环,两层循环,把所有可能的开始和结束都找到。【注意】end从0开始,即将最开始的字符加进去。原创 2024-08-15 22:57:59 · 335 阅读 · 0 评论 -
LC701-中-二叉树搜索树中的插入操作
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。因此一般左右子树都要接收返回的值(递归构建),然后将构建好的二叉树返回。迭代的方式,如果只使用当前节点,当迭代到需要插入的空位时,已经丢失了父节点的值;当然也可以把插入的节点当做头节点,然后对树的结构做调整;使用递归法返回构建好的树,可以将新的二叉树的指针连接到树上,就是上次节点接住了递归函数的返回值。类似双指针法,cur指针走到条件时,prev指针进行操作,最后操作时判断插入节点的方向。原创 2024-07-30 10:48:53 · 311 阅读 · 0 评论 -
LC235-中-二叉搜索树的公共祖先
为什么是第一次出现在区间内就是呢,想象一下,上图终[1,3, 5, 6, 8, 9],其中找1和9的最近公共祖先,自上而下的遍历,5是第一次出现在区间内,无论向左还是向右,这些点是第二次出现在区间内,则会跑到另一个子树上,因此不能满足寻找公共祖先的条件。【考虑到二叉搜索树的性质】:如果一个节点第一次出现在p和q的区间(q.val < q.val)内,则其就是二叉搜索树的最近公共祖先。在二叉搜索树的公共祖先中,使用后序遍历的方式在左右子树中查找,并扫描了整个树的节点,能不能扫描部分节点,以节省时间?原创 2024-07-28 16:14:34 · 256 阅读 · 0 评论 -
LC236-中-二叉树的最近公共祖先
最近公共祖先的定义为:对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。找祖先节点只判断当前节点是不是一个目标节点的祖先节点。是不是可以在左右子树中同时找孩子节点,如果找到则其为最近公共节点(因为是自底向上查找的)刚开始的思路是找目标节点的所有公共节点,找到祖先节点后,加入列表中,从后向前遍历,最有一个相同的就是最近公共祖先节点。后序遍历:在子树中招目标节点,如果找到,就将节点放入List中。原创 2024-07-28 11:33:00 · 248 阅读 · 0 评论 -
LC501-简-二叉搜索树中的众数
可以使用Map,然后对Map进行排序,求出现次数最大的树。时间复杂度为O(nlogn),空间复杂度为O(n)。也可以不排序,直接求频率最大的数。时间复杂度为O(n), 空间复杂度为O(n)给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按。从一般的角度考虑,求解二叉树的众数;遍历二叉树,获取所有的值,求解众数。直接从BST中序获取有序的序列,使用有序序列求解众数。基本与有序数组的遍历是一样的。原创 2024-07-26 23:39:38 · 652 阅读 · 0 评论 -
LC530-简-二叉搜索树的最小绝对差
对于一般二叉树来说,返回任意两个节点差的最小值(绝对值),先取出所有的元素,对元素进行排序,找两两差的最小值。时间复杂度为O(nlogn),空间复杂度O(n),主要是排序算法时间复杂度高。使用一个指针保存前一个节点,第一次遇到的时候不计算,而后保存前一个值,计算中序遍历当前节点和前一个节点的差。但是对于BST来说,由于知道节点之间的大小关系,可以省去排序的步骤,时间复杂度就是O(n),空间复杂度为O(n)。由于BST遍历的时候就有一定的顺序,所以在中序遍历的时候,能不能计算当前节点和前一个节点的值呢?原创 2024-07-24 00:22:42 · 234 阅读 · 0 评论 -
LC98-中-验证二叉搜索树
遍历的方式最慢,因为要彻底遍历整个树;对于递归的情况,如果遇到不满足的情况就即刻返回了,不会遍历整个树;给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。逐个比较的问题,不能比较整个子树;二叉搜索树的先验知识:中序遍历二叉搜索树,这个序列为递增序列。当遍历所有的节点后,没有出现false的情况,则为true。知道这点后,可以获取中序遍历的序列,检测其是否递增即可。当出现不满足条件的节点,则返回false。采用中序遍历的方式,检测元素是否递增。根据上面的规则,递归判断。原创 2024-07-23 01:42:21 · 407 阅读 · 0 评论 -
LC700-简-二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。在 BST 中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节点不存在,则返回 null。对于二叉树搜索树,由于具有节点的大小关系,在遍历二叉树的过程中,指定了遍历的方向,进入一个分支后,则不会进入另一个分支,时间复杂度O(logn)这个是没有想到的方法,BST查找具有的性质就是不用回溯,只有一条路径,因此可以对这条路径进行遍历。原因: root更新后,不可以直接使用,需要判断其是否为null。首先想到的就是递归遍历。原创 2024-07-22 00:42:40 · 309 阅读 · 0 评论 -
LC617-合并二叉树
对于递归结束的条件,可以进行代码优化;返回树的逻辑可以为:如果一颗树为空,则返回领一颗,如果领一颗是null则直接结束;如果不是null,则进行了连接。将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并二叉树需要遍历整个树;由于对左右树进行操作,考虑使用递归遍历。给你两棵二叉树: root1 和 root2。注意: 合并过程必须从两个树的根节点开始。返回合并后的二叉树。原创 2024-07-21 11:31:11 · 481 阅读 · 0 评论