- 博客(59)
- 收藏
- 关注
原创 843.n-皇后问题 做题笔记
主斜线上采样的多个点的x、y值的差,即说明多个点可通过减法映射到数组中的同一位置,判断斜线上是否出现过一次皇后,即查看 dg[x - y] 是否为1即可。副斜线上采样的多个点的x、y值的和,即说明多个点可通过加法映射到数组中的同一位置,判断斜线上是否出现过一次皇后,即判断 udg[x + y] 是否为1即可。对于第 r 行的第 i 个位置,判断每个点是否可以放皇后,如果可以,则放皇后,然后处理 r + 1 行。1.用col数组表示同一列有无皇后,0表示无,1表示有。每一行必定有一个皇后,对行进行深度遍历。
2024-05-14 16:22:28
300
原创 842.排列数字 做题笔记
第一个空位上除了填过的 1,2,还可以填 3。第三个空位上除了填过的 1,2,没有其他数字可以填。第三个空位上除了填过的 2,没有其他数字可以填。第一个空位上除了填过的 1,2,3,没有其他数字可以填。第二个空位上除了填过的 2,3,没有其他数字可以填。第二个空位上除了填过的 1,3,没有其他数字可以填。第二个空位上除了填过的 1,2,没有其他数字可以填。假设有 3 个空位,从前往后填数字,每次填一个位置,填的数字不能和前面一样。填好第一个空位,填第二个空位,第二个空位可以填 2,填写后为:1 2 __
2024-05-13 18:07:36
1409
原创 838.堆排序 做题笔记
2.堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值, 这种情况称为大顶堆,注意:没有要求结点的左孩子的值和右孩子的值的大小关系。1.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序, 它的最坏、最好、平均时间复杂度均为 O(nlogn), 它也是不稳定排序。4. 删除任意一个元素 heap[k] = heap[size];3.每个结点的值都小于或等于其左右孩子结点的值, 这种情况称为小顶堆。首先要明确要进行down操作时必须满足左儿子和右儿子已经是个堆。
2024-04-27 11:10:05
198
原创 240.食物链 做题笔记
(我们不需要知道每个点之间的关系,这需要n方时间复杂度,只需要知道每个点和根节点之间的关系即可)x吃y意味着d[x]-d[y]-1)%3 == 0,故有d[px] = d[y] + 1 - d[x];同类意味着d[x]+d[px]-d[y])%3 == 0,故有d[px] = d[y] - d[x];“距离”:x吃y表示y到x的距离为1. y是第0代,吃y的x是第1代,吃x的是第2代…三种关系:用点到根节点之间的距离表示其余根节点之间的关系。mod 3 = 1:可以吃根节点。
2024-04-26 21:38:13
908
原创 837.连通块中点的数量 做题笔记
3. 对于查询连通块中点的数量,就是查询集合的大小。(通过查询祖宗节点的size来查询集合大小)额外用size数组维护每个连通块中点的数量。1. 对于连边操作,其实就是集合间的合并。(把a连到b的祖宗节点下面,反之同理)2. 对于查询是否在同一连通块,就是集合的询问操作。(看是否是一个祖宗节点)/额外注意,a等于b时不要重复加,不然相当于一棵树点的数量变成了两倍。初始化size数组,开始的时候每个连通块就是这个点自身,所以是1。该题是并查集的应用,乍看像图论,其实是并查集。连边操作,其实就是集合间的合并。
2024-04-26 16:03:07
439
原创 836.合并集合 做题笔记
至此,我们发现所有的1,2,3的父节点全部置为了4,实现路径压缩;find(3) p[3] = 4 p[3] = 4 将p[3]返回。find(2) p[2] = 3 p[2] = 4 将p[2]返回。find(1) p[1] = 2 p[1] = 4 将p[1]返回。//将x的父亲置为x父亲的祖先节点,实现路径的压缩。find(4) p[4] = 4 将p[4]返回。//将a的祖先点的父节点置为b的祖先节点。//返回x的祖先节点 + 路径压缩。//祖先节点的父节点是自己本身。
2024-04-26 15:23:31
274
原创 831.KMP字符串 做题笔记
这是一个字符串匹配算法,对暴力的那种一一比对的方法进行了优化,使时间复杂度大大降低。举例来说,有一个字符串"BBCABCDABABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,
2024-04-18 11:11:30
1316
原创 154.滑动窗口 做题笔记
1.上面四个步骤中一定要先3后4,因为有可能我们需要输出的正是新加入的那个元素;2.队列中存的是原数组的下标,取值时要再套一层,a[q[]];2.解决队尾与当前元素a[i]不满足单调性的问题;4.hh从0开始,数组下标也要从0开始。3.算最大值前注意将hh和tt重置;1.解决队首已经出窗口的问题;3.将当前元素下标加入队尾;4.如果满足条件则输出结果;
2024-04-11 14:18:54
127
原创 830.单调栈 做题笔记
这道题我们只需要维护一个从栈底到栈顶单调递增的栈,每次不符合单调性就弹栈,最后输出栈顶即可。用单调递增栈,当该元素可以入栈的时候,栈顶元素就是它左侧第一个比它小的元素。
2024-04-10 16:20:24
194
原创 829.模拟队列 做题笔记
入队push:因为 tt 代表队尾,[hh, tt] 代表元素所在区间。所以入出队可以用 tt++实现,tt++后,队列有效区间变为[hh, tt + 1], 然后在q[tt+1]位置放入入队元素。所以出队可以用 hh++实现,hh++后,队列有效区间变为[hh + 1, tt]。是否为空empty:[hh, tt] 代表元素所在区间,当区间非空的时候,对列非空。这个数组,最前面叫队头,最后面叫队尾。询问队头query:用 hh 代表队头,q[hh] 就是队头元素,返回 q[hh] 即可。
2024-04-10 15:41:21
253
原创 3302.表达式求值 做题笔记
(1)如果栈顶是+,即将入栈的是+,栈顶优先级高,需要先计算,再入栈;(3)如果栈顶是*,即将入栈的是+,栈顶优先级高,需要先计算,再入栈;(4)如果栈顶是*,即将入栈的是*,栈顶优先级高,需要先计算,再入栈;(2)如果栈顶是+,即将入栈的是*,栈顶优先级低,直接入栈;如果栈顶的运算符优先级高,先出栈计算,新运算符再入栈。一开始,初始化好输入的字符串,以及操作数栈,运算符栈。一步步,扫描字符串,操作数一个个入栈,运算符也入栈。栈内的优先级高,还是先计算(3*4=12),再入栈。
2024-04-10 13:38:08
428
原创 827.双链表 做题笔记
思路与单链表类似,双链表额外开两个数组放左指针和右指针。尤其要注意指针变动时,有的顺序不能改变,否则指针会丢失。注意idx当前操作结点从2开始,所以下标要注意与上一题单链表不同。
2024-04-09 22:19:45
288
原创 802.区间和 做题笔记
答:l和r是原数轴上的下标,alls是所有需要用到的下标,而不是单单那些非0的点的下标,求区间和的时候有可能会用到那些非0点。二分查找的过程就是将这些有序原下标转化为连续的1,2,3,4,5.....下标的过程,这个下标是a数组的下标,a数组用来存储每次+c的数据。每次询问l和r之间的区间和,只需要计算[l,r]之间非零的数之和,我们最后计算用的前缀和s是a数组的前缀和,也就是需要经过原下标(l与r)—>离散后下标的转化,我们访问[l,r]区间也就是访问a数组的一个区间。unique()函数的底层原理。
2024-04-02 17:29:35
179
原创 803.区间合并 做题笔记
的auto关键字是一个类型说明符,通过变量的初始值或者表达式中参与运算的数据类型来推断变量的类型。(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问。for(auto a:b)中b为一个容器,效果是利用a遍历并获得b容器中的每一个值,但是a无法影响到b容器中的元素。3.把最后的区间加入。
2024-04-02 15:16:04
346
原创 801.二进制中1的个数 做题笔记
2.对于x的二进制表示中,k之左的数值,它们在x中对应了0 或者 1,而在-x的二进制表示中,他们对应 1 或 0, 与 x 的数值相反(0对1, 1对0)。因此,在进行按位与运算时,x中第k位之左的数值能够与-x中的相应位数值得到0。3.对于第 k 位来说,x 的第k位为1,-x的第k为也为1,因此,在进行按位与运算时,x中第k位的数值能够与-x中的第k为数值得到1。1.对于x的二进制表示中,k位之右的数,它们在x中都对应了0,所以对于这部分的数值,x & (-x) = 0。最右边的1所对应的数值。
2024-03-28 21:48:22
284
原创 2816.判断子序列 做题笔记
整个过程中j指针不断扫描b数组并且向后移动,相当于不断给i指针所指向的a数组创建匹配的机会,只有匹配成功时i指针才会向后移动一位,当i == n时,说明全部匹配成功。2.整个过程中,j指针不断后移,而i指针只有当匹配成功时才后移一位,若最后若i == n,则说明匹配成功。1.j指针用来扫描整个b数组,i指针用来扫描a数组。若发现a[i] == b[j],则让i指针后移一位。为什么双指针做法是正确的?
2024-03-28 21:12:41
220
原创 800.数组元素的目标和 做题笔记
用双指针方法求解,i指针遍历a数组,j指针遍历b数组,由于数组升序排列,所以指针具有单调性,i单调增,j单调减。时间复杂度简化到 O(n+m)。
2024-03-28 20:56:21
108
原创 799.最长连续不重复子序列 做题笔记
2.对于每一个i,如何确定j的位置:由于[j, i - 1]是前一步得到的最长连续不重复子序列,所以如果[j, i]中有重复元素,一定是a[i],因此右移j直到a[i]不重复为止(由于[j, i - 1]已经是前一步的最优解,此时j只可能右移以剔除重复元素a[i],不可能左移增加元素,因此,j具有“单调性”、本题可用双指针降低复杂度)。3.用数组s记录子序列a[j ~ i]中各元素出现次数。
2024-03-28 20:27:04
129
原创 798.差分矩阵 做题笔记
首先构造原数组的差分数组a:a[i][j] = s[i][j] - s[i - 1][j] - s[i][j - 1] + s[i - 1][j - 1];让整个s数组中红色矩形面积的元素再加上c,红色内的相当于被减了两次,再加上一次c,才能使其恢复。,比如对a数组的a[i][j]的修改,会影响到s数组中从s[i][j]及往后的每一个数。修改a数组后,重新循环构造新的前缀和数组,此时这个前缀和数组s就是我们想要的答案。
2024-03-28 20:13:19
104
原创 797.差分 做题笔记
给定区间[l ,r ],让我们把a数组中的[ l, r]区间中的每一个数都加上c,即 a[l] + c , a[l+1] + c , a[l+2] + c ...... a[r] + c;也就是说,a数组是b数组的前缀和数组,我们把b数组叫做a数组的差分数组。首先让差分b数组中的 b[l] + c ,a数组变成 a[l] + c ,a[l+1] + c...... a[n] + c;然后打个补丁,b[r+1] - c, a数组变成 a[r+1] - c,a[r+2] - c......a[n] - c;
2024-03-28 19:26:50
223
原创 796.子矩阵的和 做题笔记
图2中(x1,y1)到(x2,y2)这一子矩阵中所有数之和:s[x2,y2]-s[x1-1,y2]-s[x2,y1-1]+s[x1-1,y1-1]图1中红框中所有数之和:s[i,j]=s[i-1,j]+s[i,j-1]-s[i-1,j-1]+a[i,j],是上一题一维前缀和的扩展。
2024-03-28 12:03:33
128
原创 795.前缀和 做题笔记
二者相减,s[r] - s[l-1] = a[l] + a[l+1]+......+ a[r],即为区间中所有数字的和。这样,对于每个询问,只需要执行 s[r]-s[l-1]。输出原序列中从第l个数到第r个数的和的时间复杂度变成了O(1)。区间[l,r]中所有数字的和。我们把它叫做一维前缀和。
2024-03-28 10:52:12
170
原创 794.高精度除法 做题笔记
设置r作为余数/每次待被除的数,初始为0。注意在结束循环之后把C翻转,与其他运算统一格式。还要特别注意r要&,不然在主函数里没有改变r的值。本题要结合现实中我们进行手写除法运算的想象,来写代码。
2024-03-16 20:13:19
147
原创 793.高精度乘法 做题笔记
设置t作为进位累加数,初始为0。for循环中注意设置条件除了A没遍历完还要有。本题与高精度加法类似,但本题是大数×小数,可以把b直接设成int型。,因为只要还有进位就要继续循环。
2024-03-16 19:24:46
156
原创 792.高精度减法 做题笔记
这里要注意不能直接用字符串的比较,因为字符串比较是基于左端对齐,从左到右,依次比较单个字符。而整数比较是基于右端对齐(最低位对齐)。此函数功能是判断是否A>=B,首先进行位数判断,再逐位判断。:设置t作为本一级的借位/本一级的答案。注意每次push到C里的时候要进行%10/10处理,即提取t的绝对值,这样符合我们的减法运算规则。:和高精度加法基本一致,就是多一个判断A是否大于等于B,否则调换位置并添加负号。本题和上一题高精度加法思路差不多,但要。
2024-03-16 17:39:21
168
原创 791.高精度加法 做题笔记
因此auto并非是一种"类型"的声明,而是一个类型声明时的"占位符”,编译器在编译期会将auto替换为变量实际的类型。t表示目前位的数的大小,模10表示把个位直接填到新数组,t自身除以10保留是否有进位。循环条件是A容器还有数或者B还有数,循环内再具体判断还有哪个剩余数。:因为给定整数较大,设置成string字符串数组类型,再逐个放入vector<int>容器,放入时注意将字符数组的数。个位数存在数组下标为0的位置,往后以此类推,这样方便进位(若进位直接在数组尾端添加)。,即a[i]-'0'。
2024-03-16 15:46:58
194
原创 790.数的三次方根 做题笔记
可以取左右边界是-100到100,因为二次方就已经到题目要求的-10000到10000了,缩小范围。由于题目要求输出精度为保留6位小数,设置循环条件为区间大于1e-8(多两位保险)。还要注意由于此题是浮点数,所以是直接边界等于mid,不用加一。本题利用的是浮点数的二分思想。
2024-03-16 11:49:06
123
1
原创 789.数的范围 做题笔记
这里特别注意第二个模板mid需要l+r+1>>2,因为c++右移向下取整,如果不加一,l=mid时mid又=l,死循环。在第一个模板结束时判断一下是否有该元素,如果没有就输出-1 -1,如果有就继续寻找结束位置。ps:单调性并不是二分的本质,有单调性可以用二分,无单调性也有可能是需要用二分。需要两个模板,一个求元素的起始位置,一个求终止位置。本题是练习二分非常好的一道题目。本身以及右边的数均大于等于x。求结束位置:要求找到最后一个。本身以及左边的数均小于等于x。求起始位置:要求找到第一个。
2024-03-16 10:56:55
180
原创 逆序对的数量 做题笔记
重要的地方在于,一个元素可以不只是在一个逆序对中存在。如果 k > j > i 且 a[i] > a[j] > a[k],那么这里有两个含 a[i] 的逆序对,分别是 (a[i], a[j]) 和 (a[i], a[k]), a[i]是可以使用多次的。还要额外注意一个问题就是数据溢出,本题要用long long 类型,因为考虑逆序数对的数量最大情况(数据是从大到小排列的),那么就是n-1+n-2+n-3+...+1,等差数列求和,(n-1)n=O(n^2),n=100000,n^2=10^10.
2024-03-16 09:42:41
163
原创 leetcode.101. 对称二叉树.详解笔记.
子函数中,判断传进来的两个结点是否都为空,若只有一个为空则结构不同,false;若两个结点值不同则false;否则就继续判断第一个结点的左子树和第二个结点的右子树是否符合要求,并且同时第一个结点的右子树和第二个结点的左子树也要看是否符合要求。这题与第100题相同的树很类似,题目要求判断给定的二叉树是否对称,我们可以把给定根结点的左子树和右子树看作两个二叉树,判定这两个二叉树是否符合镜像要求即可。:空间复杂度和递归使用的栈空间有关,这里递归层数不超过n,故空间复杂度为 O(n)若根结点为空,是对称树。
2023-04-27 08:54:04
93
原创 leetcode.100. 相同的树.详解笔记.
可以利用深度优先搜索BFS,设想给定的两个二叉树中的某个结点,若都为空可以相同,若只有一个为空肯定不同,值不同肯定不同,若当前结点判定相同,再去看左子树是否相同,右子树是否相同,可以用递归实现。:O(min(m+n)),m和n分别是两个二叉树的结点个数。空间复杂度取决于递归调用的层数,递归调用的层数不会超过较小的二叉树的最大高度,最坏情况下,二叉树的高度等于节点数。:O(min(m+n)),m和n分别是两个二叉树结点个数。只要有一个走到空就结束函数,因此被访问到的节点数不会超过较小的二叉树的节点数。
2023-04-27 08:53:48
69
原创 leetcode.111. 二叉树的最小深度.详解笔记.
利用之前层序遍历的模板,添加一个计数器,若左子树右子树都为空说明走到了叶子结点,可以返回最小深度。
2023-04-27 08:53:33
76
原创 leetcode.104. 二叉树的最大深度.详解笔记.
先计算当前结点的左子树深度,再计算右子树深度,最后取最大值再加1即为以当前结点为根的子树深度(本结点也算一层)。利用层序遍历算法把每一层结点入队,每到新的一层计数器加一,队列空时返回计数器即为二叉树深度。O(depth),递归需要栈空间,栈空间取决于递归深度也就是二叉树深度。空间复杂度:取决于队列长度,最坏情况下是单链树,达到 O(n)。时间复杂度:O(n),每个结点被遍历一次。可以用递归实现,走到空返回0。O(n),每个结点被遍历一次。解法一:DFS广度优先搜索。解法二:BFS深度优先搜索。
2023-04-27 08:52:50
75
原创 leetcode.515. 在每个树行中找最大值.详解笔记.
本题考查最基本的二叉树层序遍历算法,DFS广度优先搜索,利用队列实现。学习到队列的c++表示,还有层序遍历的算法,一维和二维容器的使用。入队前都判空,可以省去很多pop语句,简便很多。:每轮置max为最小值要在循环体内置,否则max已经在上一轮改变了,再比较就有可能出错。leetcode.102. 二叉树的层序遍历.详解笔记._蜜桃鲜橙多的博客-CSDN博客。本质相同,也是考察二叉树层序遍历算法,这里用DFS实现。只不过多一步比较大小。
2023-04-27 08:52:25
51
原创 leetcode.116. 填充每个节点的下一个右侧节点指针.117. 填充每个节点的下一个右侧节点指针 II.详解笔记.
遍历本层结点时,若当前结点右侧还有结点,也就是队列非空,且当前结点不是本层最后一个结点(这个时候之前若有结点有孩子,孩子已入队,队列非空,但不应填充next指针) ,则填充next指针。入队前都判空,可以省去很多pop语句,简便很多。head不断在本层后移,当head走到空时说明本层已遍历完,可以开始下一层,leftmost不断跳到下一层最左结点,直到走到空说明所有层都已经填充完毕。从根结点开始,用leftmost记录当前层最左结点,当前指针head作为父结点,逐层遍历为下一层的结点填充next指针。
2023-04-27 08:52:25
46
原创 leetcode.429. N 叉树的层序遍历.详解笔记.
本质相同,也是考察二叉树层序遍历算法,这里用DFS广度优先实现。从本题学习到了类中二维容器成员用法,Node类中成员children是一个一维容器,存放的都是Node*结点,遍历时只需利用容器size函数遍历即可。本题考查最基本的二叉树层序遍历算法,DFS广度优先搜索,利用队列实现。学习到队列的c++表示,还有层序遍历的算法,一维和二维容器的使用。入队前都判空,可以省去很多pop语句,简便很多。leetcode.102. 二叉树的层序遍历.详解笔记._蜜桃鲜橙多的博客-CSDN博客。
2023-04-27 08:51:34
48
原创 leetcode.637. 二叉树的层平均值.详解笔记.
本题考查最基本的二叉树层序遍历算法,DFS广度优先搜索,利用队列实现。学习到队列的c++表示,还有层序遍历的算法,一维和二维容器的使用。入队前都判空,可以省去很多pop语句,简便很多。本质相同,都是考察二叉树层序遍历,这里用DFS广度优先搜索实现 ,只不过多加一步算平均值。leetcode.102. 二叉树的层序遍历.详解笔记._蜜桃鲜橙多的博客-CSDN博客。
2023-04-26 15:01:11
59
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人