- 博客(21)
- 收藏
- 关注
原创 【算法学习笔记】整数拆分——呕心沥血,真正学会写状态转移方程!
3拆分相乘的最大值为2,所以3拆分之后乘1的最大值就是2(2 1 1, 1 1 1 1其最大值确实为2)。拆分2 2同理,其最大值为2 * 1,这里我们只拆其中一个2。再进行拆分1*4拆分后的最大值为1*4 = 4, 2*3拆分之后的最大值为2*2 = 4;首先,题目明确说了我们必须把数拆成两个以上,如果不拆2的最大值就不是1*1而是2了,这明显是不对的。比如3 2我们拆2,可以拆成3 1 1,这时我们发现其完全可以被4 1拆出来(把4拆成3 1)。1只能拆成0 1相乘为0,2只能拆成1 1相乘为1。
2026-04-21 15:13:06
342
原创 【算法学习笔记】不同路径——动态规划类题目的做题思路
对于本题,某个格子只能从他的上面或者左边到达,所以不难看出dp[x][y] = dp[x - 1][y] + dp[x][y - 1]。不难发现,要求到终点的路径数量,就要知道终点左和上两个的路径数量,以此往起点类推,我们就要求到达每个格的路径数量。在确定状态含义的时候我们已经确定状态的含义为“到达某个格的所有路径数量”。到达某个地方有0条路径的意思是我们到不了这个地方,而我们显然是能到起点的,所以应初始化为1。因为后面的状态我们可以通过前面的状态去递推,但是第一个(前几个)状态我们是没法推出来的。
2026-04-17 12:59:19
171
原创 【算法学习笔记】动态规划入门——从最简单的问题开始动态规划
动态规划简单说,就是把一个复杂的大问题拆成若干个相互关联的子问题,先求出子问题的解并存起来,再逐步组合出原问题的最优解,避免重复计算。就像斐波那契数列中,我们把求第n位这个复杂的大问题,拆成了求前面每一位这些子问题。我们求出每个子问题的解之后,用数组存起来,最后推导出最终的大问题。为什么斐波那契数列问题简单?因为他一上来就给了你状态转移方程,而我们在做动态规划的时候,一个难点就是求出状态转移方程。假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?
2026-04-17 09:18:20
44
原创 【算法学习笔记】二叉树的最近公共祖先——为什么说二叉树的遍历顺序很重要?
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(3节点5和节点1的最近公共祖先是节点3。5节点5和节点4的最近公共祖先是节点5。因为根据定义最近公共祖先节点可以为节点本身。1。
2026-04-13 19:22:40
309
原创 【算法学习笔记】通过遍历得到的数组构建二叉树
对于前序+中序遍历来确定一颗二叉树和这种确定方法是一样的,就是把从最后一位取根节点变成从第一位取根节点即可。但是如果只有前序和后序就无法确定一颗二叉树了,因为我们无法通过根节点来分割左右子树。
2026-04-08 14:50:47
342
原创 【算法学习笔记】二叉树的最大最小高度——网上大多数的题解并不严谨?
用了类似回溯算法的思想,当遍历到叶子节点就回溯一层。本质是求,每往下走一层depth就+1,如果发现走到头了就回退一层,回退的时候depth-1.
2026-04-01 20:28:17
165
原创 【算法学习笔记】二叉树的层序遍历——广度优先搜索在二叉树中的应用
我们当然可以使用两个队列,一个队列存放着我们正在遍历的节点,用另一个队列记录将要被遍历的子节点。由于上一层的已经被取出,这一层的还未放入,所以size的大小就是我们这一层要遍历节点的数量。从根节点开始,我们遍历到根节点由于第一层只有一个节点,所以取出根节点,然后记录我们将要的遍历根节点的左右子节点。然后我们遍历根节点的左右子节点,取出被记录的根节点的左子节点然后记录我们将要遍历的其左右子节点。取出被记录的遍历根节点的右节点,然后记录我们将要遍历的其左右节点。以此类推......
2026-03-31 13:57:05
43
原创 【算法学习笔记】栈——解决“相邻字符匹配、”问题的好伙伴
栈为先进后出容器。可以理解为一个A4纸大小的盒子,向里面放A4纸,当想要取出时只能先取最后放的纸。
2026-03-29 11:21:04
201
原创 【算法学习笔记】用图来真正讲懂KMP算法!next数组怎么求?next数组为什么这么求?透过现象看本质,了解对称的魅力
kmp算法的代码并不复杂,但是想要真正弄清楚其中脉络还是非常烧脑的,通过图解可能能更好地帮助理解,但是还是有一定难度。如果还是不理解可以尝试自己替换“图解原理”中的数值,或者去抄一份代码然后去调试,这样能帮助你更好地了解。
2026-03-29 10:00:00
800
原创 【算法学习笔记】双指针删除数组、字符串元素——额外空间复杂度仅为o(1)的超好用方法
删除数组、字符串中的元素,并将后面的元素补到被删元素的位置上。并且这种方法不会创建新的数组减少了内存开销,同时时间复杂度仅为o(n)。
2026-03-27 16:40:02
202
原创 【算法学习笔记】前缀和——计算连续区间和的好用方法
需要多次计算一个大区间中小的连续区间所有元素的和,前缀和方法在完成每个前缀和的计算后,每次计算一个区间元素的和时复杂度仅为o(1)。
2026-03-24 18:34:31
68
原创 【代码学习笔记】二分法及其易错点
2.区间右值改变分析:如果区间是左闭右开,当M>目标时,说明M和其右侧都大于目标,但是因为右侧是开区间,如果我们这时令R = M - 1则M - 1不被包含在我们搜索区间内,会漏掉M - 1位置的数。设置变量L和R,初始L为数组开头,R设置为数组大小-1。因为是有序数组,所以当M > 目标时说明M右侧比M大的数都大于目标,所以M和其右侧都不用再查找,令R =因为是有序数组,所以当M > 目标时说明M右侧比M大的数都大于目标,所以M和其右侧都不用再查找,令R =设置变量L和R,初始L为数组开头,R设置为。
2026-03-23 22:18:53
42
原创 C语言分别打开的两个文件指针有没有可能相等?文件新手误区
如上面这个代码,我一开始的想法是通过fseek每次将fp1_last向前偏移一位,直到偏移到文件头指针。结构体(即使它们操作同一个文件)。因此,这两个指针的值(即地址)是不同的,所以。永远为真,即使它们操作的是同一个文件的同一个位置。两次打开同一个文件时,会得到两个独立的。是一个指向结构体的指针。指针,它们分别指向两个不同的。但是这种想法是错的。
2025-12-30 22:35:26
185
原创 C语言二级指针,是什么?怎么用?让你的程序不再出错
此时p为一级指针,p“指向”(存储)a的地址;*p指向a本身也可以等价为a。pp为二级指针,pp“指向”(存储)p的地址;*pp指向p的地址也可以等价为p;**pp也可以理解为 *(*pp), 其指向p指向的地址也就是a本身,可以与a等价。所以printf("%d", a);与printf("%d", **pp);结果都是0。而p则为a的地址,*pp也为a的地址,pp为p的地址。
2025-12-29 20:20:49
588
原创 C语言简单整形数组去重时遇到的小问题
将长度为a的整形数组a1去重后输入数组mix,通过flag标记在a1[i]在mix中是否出现。但是在数组初始化时已经将mix全部初始化为0,在以下代码判断时,如果a1[i]中元素为0则会认为重复,不记入数组mix。解决办法:在向a1输入时,如果第一次输入0则让记mix数组大小的cnt++,增加1以空出一个0。
2025-12-29 12:02:09
195
原创 devc++/devcpp调试用法,调试怎么用?调试的细节。
在编程之前,不然那些离奇bug你根本发现不了出现在哪。调试时可以一步一步监测程序的运行,并观察变量值的变化。
2025-12-28 20:03:15
1250
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅