
跟着灵茶山学算法
文章平均质量分 87
chenhehe11
每日代码学习打卡~大家一起加油啊
展开
-
三种遍历方法验证二叉搜索树
给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。[1, 104]原创 2025-02-18 21:44:34 · 711 阅读 · 0 评论 -
递归在树中的利用
判断的标准是这两棵树在结构上相同,并且对应节点的值也相同。我们就可以采用递归的方式遍历左右子树,判断它们相不相等,递归的边界条件是p和q有一个为空,此时就可以判断两个结点是否相同了。其实很简单,由于我们得到的深度是非负数,那么如果我们在递归过程中发现左右子树不平衡,就返回-1。其实这一题和上一题几乎就是一模一样的,但是判断的对象变成了左子树和右子树是否相等,我们完全可以借用上一题的代码,小作修改而成。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。,编写一个函数来检验这两棵树是否相同。原创 2025-02-16 23:55:50 · 2021 阅读 · 0 评论 -
两种得到二叉树深度的递归方法
递归二叉树的深度有两种方法,一种就是直接采用递归,递归到叶子结点之后返回,记录左子树和右子树的深度,取它们的最大值加1为二叉树的深度。还有一种方式就是我们可以在递归的过程中记录当前已经遍历过的结点个数,设置一个全局变量,实时更新最大值。是指从根节点到最远叶子节点的最长路径上的节点数。原创 2025-02-15 23:27:22 · 376 阅读 · 0 评论 -
链表中删除结点的算法
不是链表中的最后一个节点,并且是给定节点的值不存在于链表中,我们就可以不删除对应。这道题一般的思路就是我们先遍历一遍数组,得到数组的长度,而后再遍历到倒数第n个。指针就到倒数第 n + 1 个结点处,也就是目标结点的前一个。注意,删除节点并不是指从内存中删除它。这题比较简单,由于不需要删除头结点,所以不用设置。,而是删除其下一个节点,而把下一个节点的值放在。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。,我们想删除它其中的一个节点。不是链表中的最后一个节点。结点到最后一个结点的时候,原创 2025-02-14 23:51:50 · 970 阅读 · 0 评论 -
环形链表笔记+刷题
首先我们假设当慢指针走到起点的时候,快指针正好比慢指针快一步(最坏情况),则快指针需要走 环长-1 步才能与慢指针相遇,而这时慢指针还没有走完一圈,最坏情况是如此,其他情况自然也是如此了。本题我们可以使用快慢指针做,由于慢指针每次向前移动一步,所以慢指针肯定会走到环里面去,而快指针相对于慢指针也是每次向前移动一步,在环里面肯定会相遇,基于此,我们不难写出以下代码。指针再次到达,则链表中存在环。首先有一个结论:快慢指针相遇的时候,慢指针还没有走完一圈。也就是说,快指针和慢指针相遇之后,慢指针走。原创 2025-02-13 21:43:28 · 1886 阅读 · 0 评论 -
反转链表练习
【温馨提示】在阅读本文之前看一下,阅读起来会更加容易哦~原创 2025-02-12 21:50:31 · 755 阅读 · 0 评论 -
反转链表解释+力扣刷题
学习过链表的朋友们都知道,链表的节点是由指针和数值组成的,每个指针都指向下一个链表,这就是链表的逻辑结构,而反转链表实际上就是将指针反转过来,指向前一个元素,且头节点指向。,头节点的下一个节点指向头节点……是一个正整数,它的值小于或等于链表的长度。,由于我们在分析反转链表时得到了一个结论:**反转完成之后,你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。的整数倍,那么请将最后剩余的节点保持原有顺序。,请你反转链表,并返回反转后的链表。,我们假设这一段链表的前面一个链表为。原创 2025-02-11 23:19:34 · 1035 阅读 · 0 评论 -
二分查找练习
那么本题可以利用上题我们得到的结论:只要一个数大于最后一个数,那么这个数就处在整个数组中较大的一部分,也就是上题中的。其实很简单,上面我们提到了,只要一个数大于最后一个数,那么这个数就处在整个数组中较大的一部分,那么是。,反之,如果一个数小于等于最后一个数,那么这个数就处在整个数组中较小的一部分,也就是上题中的。的元素,由于峰值一定在数组内,所以最右边的元素一定是蓝色,又由于“对于所有有效的。的元素,由于最小元素一定在数组内,所以最右边的元素一定是蓝色,所以我们依然在。的数组,预先按照升序排列,经由。原创 2025-02-10 21:29:25 · 995 阅读 · 0 评论 -
二分查找解析
给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]输入:nums = [], target = 0输出:[-1,-1]nums。原创 2025-02-09 21:01:36 · 870 阅读 · 0 评论 -
滑动窗口的运用
给定一个含有n个正整数的数组和一个正整数target找出该数组中满足其总和大于等于target的长度最小的,并返回其长度**。**如果不存在符合条件的子数组,返回0。原创 2025-02-08 17:38:47 · 2025 阅读 · 0 评论 -
相向双指针练习
整体的思路就是这样,所以沿用三数之和的求解思路,首先对数组排序,而后再用一个双指针,便可以得出结果了,需要注意的是,我们使用。如同前后缀的方法啊,我们还是把洼地看成是宽度为1的桶,如果我们一开始只知道左边的前缀最大值和右边的后缀最大值,比如示例一中的。来说,它的前置最大值为1,后缀最大值为3,由于前缀最大值不会再缩小(也就是“桶”的高度不会再缩小),所以我们可以认为。中,而后将较短的那条线的下标向中间靠拢一位,重复上述操作,并且将得到的容量不断比较,替换,便可以得到最大的容量;原创 2025-02-07 13:20:46 · 542 阅读 · 0 评论 -
力扣刷题笔记
题目中还提到,答案中不可以包含重复的三元组,那么我们如何进行去重呢?很简单,只需要在移动指针的时候将当前指针对应的数组元素和移动前对应的数组元素进行对比,如果相同则继续移动指针便可。其实这个题就是我们上面题增加了一个加数,整体逻辑是差不多的,由于输出的顺序和三元组的顺序并不重要,我们便可以直接对数组进行重新排序,又题中提到。都是大于9的呢,所以我们大可以将15排除在我们的答案之外,同样的道理,若两数相加小于。,我们便可以将较小的数排除在我们的答案之外,根据这个,我们可以用双指针法写出这道题。原创 2025-02-06 18:23:13 · 596 阅读 · 0 评论