自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(248)
  • 收藏
  • 关注

原创 求欧拉回路/欧拉通路

https://leetcode.cn/problems/cracking-the-safe/description/https://leetcode.cn/problems/reconstruct-itinerary/description/

2025-07-01 18:36:25 117

原创 未排序数组的数层去重

https://leetcode.cn/problems/non-decreasing-subsequences/

2025-07-01 18:00:09 124

原创 红黑树 RED_BLACK_TREE

https://github.com/Neo-ZK/RB_Tree

2025-07-01 17:56:55 92

原创 爬楼梯类问题

有些人将一些爬楼梯模型的拓展题目强行解释为特殊化的背包问题,这样也行,毕竟我们上面就分析过,是可以将爬楼梯问题抽象为背包问题的,只不过这个背包需要考虑物品的顺序,但从理解上来说,将其解释为爬楼梯问题更容易理解。不过,如果我们注意观察爬楼梯模型和背包模型的代码,就会发现,爬楼梯是先遍历背包容器,再遍历物品;首先,爬楼梯类题目可以抽象为“类似于”背包问题的题目:将每次可以爬的楼梯数视为物品,目标楼梯阶数为背包容积,那么爬楼梯题目就相当于,给定。个物品,求装满背包所需的物品个数,不限制物品的使用次数。

2025-07-01 17:52:38 446

原创 打家劫舍问题

出现了最大值最小,就是一个典型的二分问题了,我们可以二分枚举这个最大值,然后在。假设实际答案更大,不可能,不会出现这种情况。不过,现在有一个问题,那就是二分出来的答案,它有没有可能不在。时间复杂度进行判断,也即判断是否存在这么一个长度大于等于。我们可以转换一下问题,相当于给我们一个数组。分类讨论,将问题转化为普通的打家劫舍问题。答案是,二分出来的答案,肯定在。的不包含连续元素序列,使得序列的。,让我们找到一个长度 大于等于。,而实际答案更小的话,那么。的不包含连续元素的序列。中,假设二分出来的答案。

2025-06-30 17:37:34 615

原创 完全二叉树的节点个数, O(log2(n) * log2(n)) 做法

如果不相等,则暴力递归计算,但由于完全二叉树中一定有一个子树是满二叉树,因此在递归过程中,有一个递归会因为 lh==rh 直接 pass 掉。对于满二叉树,我们可以递归左子树,在 O(logn) 时间内算出树的高度 h,然后计算 2^h-1 即可得到满二叉树中总的节点个数。所以,我们据此,可以优化完全二叉树中总结点个数的计算效率,当递归左子树的深度等于递归右子树的深度时,直接计算 2^h-1。所以这里实际上只暴力递归了半颗子树,由于每次递归只需要递归 1/2,所以总的递归深度为 log2(n)

2025-06-18 19:43:04 234

原创 二叉搜索树相关问题

669. 修剪二叉搜索树450. 删除二叉搜索树中的节点701. 二叉搜索树中的插入操作

2025-06-17 14:26:44 215

原创 二叉树三种遍历方式的非递归写法

直接模拟递归的过程即可。打标记:使用 nullptr 表示根节点出栈。

2025-06-17 13:24:36 183

原创 LeetCode116.按字典序排在最后的子串 -- 求字符串中的最大后缀子串

由于只需要比较后缀,因此对于每个后缀子串,我们只需要记录其起点即可,暴力的比较 n 个后缀子串时间复杂度为。是最大的子串,那么由于字典序的特性(字符串相同时,长度越长,字典序越大)中任意字符构成的子串都不可能是最大子串,从而,我们可以直接更新。)的形式,也即一定是从某个字符出发,一直到字符串的结尾。在所有回合结束后,找出盒子中 字典序最大的 字符串。中对应字符构成的后缀子串的。开始的后缀子串更大,我们还应该更新。中任意字符构成的后缀子串都是小于。构成的后缀子串都是大于对应。的限制,字符串的长度最大为。

2025-06-11 10:53:17 314

原创 LeetCode2845.统计趣味子数组的数目 -- 数学 | 模运算

*注意:**子数组是数组中的一个连续非空的元素序列。以整数形式表示并返回趣味子数组的数目。这样,我们就将问题转换为了,在一个。,我们可以用前缀和简化,也即满足。那么这下思路就简单了,遍历。满足下述条件,则称其为。请你找出并统计数组中。

2025-05-29 19:48:51 878

原创 在【非负数组】中利用【负号】表达特定含义

依然是通过负号表示哈希的语义,这里的哈希表示该数字有没有被处理过。,请你找出其中没有出现的最小的正整数。并且只使用常数级别额外空间的解决方案。的语义,也即实现哈希的效果。给你一个未排序的整数数组。请你实现时间复杂度为。

2025-05-11 17:19:02 153

原创 数字搬家 | 基于交换的思想 | O(N)+O(1)

这题有些难度,单纯的套模板无法解决问题了,我们需要对数字进行转换,将其视为图,严格来说是单链表。具体的看注释,这道题和之前的题目不同,前面的题目都是。所谓的数字搬家,又称为基于交换的思想,指的是对于。,请你找出其中没有出现的最小的正整数。的时空复杂度下实现排序的效果。的特性,可以帮助我们解决很多问题。中的数字,并以数组的形式返回结果。),可知至少存在一个重复的整数。只有 一个重复的整数 ,返回。范围内,不存在重复的数字,。的整数,并以数组形式返回。此时,如果有一个重复的数字。构成了一个环,重复的数字。

2025-05-11 16:25:02 204

原创 LeetCode92 反转链表 -- 思维 | 一次遍历

先找到需要反转的子链表的头节点和尾节点,反转子链表,修改指针关系。,可以将这三个链表节点依次插入到链表节点。节点,那么此时就是头插到一个新链表中。

2025-05-11 15:52:45 267

原创 求斐波那契数列的5种方法

求斐波那契数列的5种方法

2025-04-16 21:43:20 970

原创 Acwing31. 表示数值的字符串 -- FSM

FSM应用

2025-04-16 15:33:16 381

原创 对角线遍历

【代码】对角线遍历。

2025-04-16 12:52:35 153

原创 AcWing62 丑数 -- 归并排序思想

【代码】AcWing62 丑数 -- 归并排序思想。

2025-04-13 10:47:38 134

原创 2023天梯赛选拔赛1 -- 补题

这个数据范围是在太小了,所以说,如果你的算法时间复杂度太小,那么基本上肯定是错的。),我们可以选择一个数放到对应的篮子里。其实题目的数据范围就已经给足了暗示了。让我们求,四个篮子的最大期望之和。题目大致就是说,我们有四个篮子(),每次给我们四个数(篮子的大小是有限制的。

2025-04-06 09:22:24 922

原创 ACWing 4493 -- 思维题 & 并查集 & dfs

那么我们只需要先找出所有的连通块,然后判断每个连通块中的每条边的度数是否位。其中并查集最简单,代码最短,因此对于求连通块问题优先考虑并查集。就可以判断该点所在连通块是不是一个简单环了。这其实是对性质:简单环中每个点的度数为。依据性质:判断每个点的度数是否为2。判断每个点是否连了两条边。的另外一种表达形式。

2025-04-06 09:21:54 660

原创 AcWing 100 -- 差分 & 贪心

我们发现,我们每次要么修改一个数,要么修改两个数(一个加一,一个减一),因此,贪心的话,第一问就解决了!对于第一问,我们可以贪心的方式,在差分数组中,每次选取两个数,对一个数加一,对一个数减一。为什么说是边界情况呢?当我们修改的范围从头开始,也就是包括头时,我们会修改。对于第二问,我们前面不止一次提到过了,差分数组。由于修改整个数组毫无意义,并且我们希望修改的。开始),最少的操作次数,使得差分数组。我们前面对修改的划分也提到了,只有修改。当我们修改的范围包括尾时,我们会修改。的值就是最后数组的元素,那么。

2025-04-06 09:21:23 722

原创 AcWing 900 -- 完全背包求方案数

非常经典的将原问题转换为背包问题。

2025-04-06 09:20:40 302

原创 AcWing 1024 -- 记忆化搜索

好的,我们已经解决了如何找到答案,但是题目中的点不是一次性全部给出的啊,难道每给一个点我们都需要遍历一次树来查找路经之和以及最长的分支长度吗?其实是不必的,我们可以保存之前查找过的信息,下次搜索时直接使用,所谓**“记忆化搜索”**。之后,有多个分支,我们必须回头走,但是,有一个分支我们是不需要回头走的,还记得前面说的吗,“每次送完外卖之后不必返回起点。出于贪心的角度,我们肯定希望不需要回头走的那个分支尽可能的长,这样我们少走的距离肯定更少。另外,需要送外卖的点是逐个添加,每添加一次都要算一次最短路。

2025-04-06 09:20:02 283

原创 AcWing 1562 -- 有层数限制的搜索

有层数限制时,推荐 BFS。

2025-04-06 09:19:29 129

原创 AcWing 3305 -- 建图

当然,我们也可以不添加虚拟源点,而是模拟虚拟源点的第一趟遍历,将所有初始时给定的作物都加入队列中即可。值得注意的是,这里的边权并不是传统意义上的边权,它代指一个条件。最晚的那个出现的时间起,我们才可能杂交,否则少一个怎么杂交。题目给定了我们一些初始作物,要求我们求目标作物,经典的。可能不容易理解了,其实很简单,虽然我们可以通过作物。最短路应该是可以看出来的,但是对于给定的规则,作物。好了,现在我们已经建立了一个图,接下来该如下求解呢?可能还容易理解,因为我们建图的时候就是如此设置的。的条件,才能到达(与。

2025-04-06 09:18:29 836

原创 ACWing 3548 -- 离线算法

2025-04-06 09:17:44 312

原创 ACWing 3549 -- dp & 滚动数组

2025-04-06 09:17:11 125

原创 AcWing 3696 -- topsort & 贪心

如果成功,那么我们便成功确定了拓扑序。那么对于剩下的没有确定方向的边,我们按照拓扑序确定方向即可。此时,一定能构成有向无环图。题目说了,给定的图不一定联通,事实上,不联通并不影响拓扑序,如果多个点之间不联通,那么他们的拓扑序是任意的。,如果失败,说明无论剩下的无向边在怎么确定方向,都不可能无环。我根据题目给定的有向边做一次。思路其实真的非常简单。

2025-04-05 23:53:35 366

原创 ACWing 4480 -- 二分 & 双指针 & 思维

,就是直接找到每个居民左侧和右侧垃圾桶的位置,记录和当前居民的位置的差值和垃圾桶的位置,最后在比较一下判断那个更近就行了。由于题目给定垃圾桶的位置升序(即使无需我们也可以排序),很容易想到二分,我们只需要枚举每个居民,然后两次二分来分别找到左侧和右侧的垃圾桶的位置就可以了。由于右侧的那个垃圾桶是居民右侧位置最小的垃圾桶,那么该垃圾桶的前一个垃圾桶一定是居民左侧位置最大的垃圾桶(如果存在的话)。我们可以从二分的语句里面去观察:由于我们需要比较左侧垃圾桶和右侧垃圾桶到居民的距离那个更小。

2025-04-05 23:53:05 606

原创 ACWing 4481 -- 双端队列 & 贪心 & dp

我们可以贪心的上下走,尽量不左右走,这样当我们第一次走到某个点的时候,左右走的次数肯定是最少的,这时候如果都不合法,那么后面的点肯定也不合法了。这时候如果下一次合法的路径走到这个点的时候,就不会继续往下走(因为已经标记为走过了),因此我们就漏了一个点。我们可以从另一种角度考虑:让状态表示的是走到这个点所需的向右走的最少次数。如果我们先走不合法的路径,然后标记为走过了,并且表示为不合法。,遍历所有的点,只需要额外记录左右走的次数就可以了。的状态表示中,我们状态的结果是这个点是否合法。,现在走到了某一个点。

2025-04-05 23:52:21 882

原创 AcWing 4706 -- 树形DP & DFS

【代码】AcWing 4706 -- 树形DP & DFS。

2025-04-05 23:51:51 126

原创 bfs判重的坑

中判重时,应优先在入队时进行判重,而不是在出队时进行判重,因为一个节点。,这就会导致其他节点出队且加入新节点的过程中,可能会重复加入多次节点。在入队到出队的过程中,可能需要先出队很多其他节点。占用的空间过大,最后可能有几个点。AC代码:在出队时判重。MLE代码:出队时判重。

2025-04-05 23:51:05 486

原创 BUG -- 线性筛素数

又因为,我们的比较符号是小于等于,这就导致下取整得到的结果我们取不到了!但是防止溢出却是是个好技巧,我们不能丢弃了,那怎么办呢?将乘法变为除法防止溢出。但其实,问题就出现在这里!此时小于上取整的结果,等价于小于等于下取整的结果。或者说,在判断时不要用小于,而是小于等于。除法,是可能不能整除的!看起来人畜无害的样子,甚至还在。因为下取整导致循环提前结束掉了!中,我们就会少判断了一些。

2025-04-05 23:50:30 302

原创 dfs的return时机问题

之后,这就会导致一个问题,那就是当某次。在这份代码中,我们将。

2025-04-05 23:49:59 760

原创 dfs剪枝(排除等效冗余)

我们用反证法:假设某个木棒的最后一段搜索失败了,存在解决方案。,我们用反证法:假设某个木棒的第一段搜索失败了,存在解决方案。的最后一段搜索失败了,但存在一种合法方案,那么肯定会存在。有限考虑分支较少的搜索方式,常见的比如从大到小排序。的第一段搜索失败了,但存在一种合法方案,那么。:排除等效的情况,本题就是很好的例子,稍后解释。的搜索顺序并不会影响答案,因此这与。的搜索顺序并不会影响答案,故矛盾。的一段成功,同理我们可以将。的最后一段,而交换木棒。的第一段搜索失败矛盾。的最后阶段成功,并且。

2025-04-05 23:49:29 666

原创 DP问题空间的优化

通过代码可以看出来:[消去维度方法]空间节省的更多,毕竟它直接把一维消去了;但是对于可能需要修改代码逻辑(例如枚举顺序)。[滚动数组方法]空间消耗是[消去维度方法]的两倍;但是它实现起来比较简单,只需要在所有用到层数那一维的地方加上& 1即可。

2025-04-05 23:48:57 254

原创 Leetcode 680 -- 双指针 & 贪心

【代码】Leetcode 680 -- 双指针 & 贪心。

2025-04-05 23:48:04 139

原创 AcWing 57 -- 数学归纳法

现在我们已经知道了数字的位数,那么对于。位数,据此我们就可以得到具体的数字。

2025-04-05 15:53:04 1011

原创 区间DP合集

312. 戳气球1547. 切棍子的最小成本

2025-04-05 12:47:53 119

原创 Floyd算法

Floyd可以正确处理有向图或带负权非回路的最短路径算法 同时也被用于计算有向图的传递闭包Floyd时间复杂度为N3空间复杂度为ON2。

2025-04-04 09:59:29 853

原创 LC416 vector<bool> 和 bool[] 的异同

通过。

2025-04-04 09:58:58 722

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除