- 博客(56)
- 收藏
- 关注
原创 LeetCode(python)——21.合并两个有序链表
用两个指针分别遍历两个有序链表,逐个将较小的值接进新链表,遍历结束,如果某个链表还有剩余,直接接入新链表即可。新链表是通过拼接给定的两个链表的所有节点组成的。将两个升序链表合并为一个新的。
2025-11-25 10:32:48
150
原创 LeetCode(python)——142.环形链表 II
所以当fast从head开始走,slow从相遇位置走,那么当fast走了a步(环的起点)时,slow走了k * b - c步,也回到了环的起点,两个指针再次相遇,返回此时的位置,即环的起点。非环部分长度设为a,环长设为b,假设快慢指针相遇时,slow走了a + c,则fast走了2 *(a + c)(1)让fast指向head链表头,一次走一步,slow从上一步的位置开始,一次一步。(1)slow、fast从头开始,slow一次走一步,fast一次走两步。(2)slow和fast相遇的节点,就是环的起点。
2025-11-24 11:13:43
326
原创 LeetCode(python)——141.环形链表
指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。当链表有环时,快慢指针走到环内时,必然会相遇。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。当链表没有环时,快指针会率先走到链表尾部。快指针一次走两步,慢指针一次走一步。仅仅是为了标识链表的实际情况。,判断链表中是否有环。给你一个链表的头节点。
2025-11-23 16:09:07
129
原创 LeetCode(python)——234.回文链表
(3)反转之后就可以比较了,当然,存在奇数和偶数长度的问题,当我们找中点时,链表后半部分的长度一定是<=前半部分的,所以只需要遍历后半部分,和前半部分不断比较即可~fast一次走两步,slow一次走一步(x = vt,fast = 2 * t,slow = 1 * t,当fast走完链表,意味着slow刚好走了链表的一半)1 2 3 3 2 1:找到的中点是左3,反转之后左边是123,右边是123,以右边为准对比。1 2 3 2 1:找到的中点是3,反转之后左边是123,右边是12,以右边为准对比。
2025-11-22 22:28:17
224
原创 LeetCode(python)——206.反转链表
在改变指针的方向时,主要是找不到下一个位置,所以在遍历的过程中,用next_temp变量存下一个节点的位置。,请你反转链表,并返回反转后的链表。curr指向当前处理的节点。pre指向前一个节点。
2025-11-21 22:08:10
185
原创 LeetCode(python)——160.相交链表
请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。- 相交的起始节点的值。
2025-11-20 20:27:12
930
原创 LeetCode(python)——240.搜索二维矩阵II
同理,从矩阵的左下角开始也OK,总之,要存在“不同方向对应偏大偏小的情况”,而不是像左上角和右下角一样,往哪边走都是增大/减小。如果target > 当前位置,则往下走(y + 1)如果target < 当前位置,则往右走(x - 1)编写一个高效的算法来搜索。从矩阵的右上角开始遍历。
2025-11-19 18:55:59
163
原创 LeetCode(python)——48.旋转图像
旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。转置:对上三角(i < j)每一个元素的行列交换。一个简单神奇的思路,先转置后反转每一行。反转:row.reverse()使用另一个矩阵来旋转图像。
2025-11-18 11:32:12
217
原创 LeetCode(python)——54.螺旋矩阵
顺时针方向:从左往右(结束后调整上边界top + 1),从上往下(结束后调整右边界right - 1),从右往左(结束后调整下边界bottom - 1),从下往上(结束后调整左边界left + 1)(2)按照顺时针方向依次遍历,当top > bottom,left > right时就停止。,返回矩阵中的所有元素。模拟螺旋轨迹,动态调整边界。(1)定义矩阵的上下左右。
2025-11-17 14:13:42
335
原创 LeetCode(python)——73.矩阵置零
3.优化:先单独处理原数组的第一行、第一列(用bool变量标识是否需要置零),再利用原数组的第一行和第一列存需要置零的行和列——空间复杂度O(1)2.优化:将ans拆分成两个数组:一个存需要置零的行,一个存需要置零的列,分别遍历这两个数组,将原数组置零——空间复杂度O(m + n)1.非常直观的想法:遍历矩阵,用一个ans数组存矩阵中的零存在的位置,再遍历ans,找到对应行、列,置零——空间复杂度O(m*n),则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。
2025-11-17 11:35:10
291
原创 LeetCode(python)——238.除自身以外数组的乘积
优化:如果要想在空间复杂度为O(1)的情况下实现,则无需使用前缀数组、后缀数组,直接存进ans。(1)从前往后,遍历数组,对当前的每一个数计算前缀乘积。(2)从后往前,遍历数组,对当前的每一个数计算后缀乘积。之中任意元素的全部前缀元素和后缀的乘积都在。(3)答案 = 前缀乘积 * 后缀乘积。之外其余各元素的乘积。时间复杂度内完成此题。
2025-11-17 09:29:44
268
原创 LeetCode(python)——56.合并区间
(2)intervals[i][1] > intervals[i+1][0]时,存在重叠,且合并区间的右端点为两者中较大的值。(1)intervals[i][1] < intervals[i+1][0]时,不可能重叠,直接存进答案。二维数组中,按照数组中第一个元素排序:sort(key = lambda x : x[0])区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].区间 [1,4] 和 [4,5] 可被视为重叠区间。区间 [1,4] 和 [4,7] 可被视为重叠区间。
2025-11-13 19:45:01
307
原创 LeetCode(python)——53.最大子数组的和
3.遍历前缀和,用min_pre记录最小的前缀和的值,用当前的前缀和 - min_pre,用max()更新答案,用min()更新min_pre。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。再次重申:数组无序——前缀和;数组有序——双指针、滑动窗口。连续子数组 [4,-1,2,1] 的和最大,为 6。2.要求最大的子数组和:即求最大的前缀和之差。是数组中的一个连续部分。1.求出每个下标的前缀和。很明显的一道前缀和~
2025-11-12 15:31:09
208
原创 LeetCode(python)——560.和为k的子数组
非常好,那么我们就可以在遍历数组计算每个下标前缀和的时候,计算target = pre[j] - k,如果已经记录的前缀和pre[i] == target,就说明对于pre[j]而言,找到了一个子数组[i....j-1]如果已知每个下标的前缀和,那么[i....j-1]这个子数组的和为k,则意味着pre[j] - pre[i] == k,左右变换一下可以得到:pre[i] = pre[j] - k。(1)前缀和——pre[i]定义为数组前i个元素的和。数组有序——滑动窗口。
2025-11-11 16:09:00
147
原创 LeetCode(python)——438.找到字符串中所有字母异位词
3.用differ记录s和p的差值(记录count中所有非0数的数量),当differ = 0 时,意味着此时窗口中的字母和p是字母异位词,记录答案。起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。不考虑答案输出的顺序。
2025-11-10 16:29:36
293
原创 LeetCode(python)——3.无重复字符的最长子串
4.找好右边界,也就意味着当前的左边界已经完成它的使命了,把它从curr剔除出去~找下一个。3.只要没有到达字符串的边界,且没有与curr中的字符重复,则不断移动右边界。,所以其长度为 3。1.用字符串curr存当前的最长子串,ans记录最长子串的长度。2.遍历滑动窗口的左边界,不断探索右边界。,请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 1。,所以其长度为 3。
2025-11-09 15:48:38
120
原创 Leetcode(python)——11.盛最多水的容器
在上面的公式中,随着指针的移动,距离必然越来越小,那么我们想要容纳的水量最多,就得想办法提高指针的高度,于是我们在移动双指针时,就应该移动高度较小的那个指针。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。头尾指针,一个公式:容纳的水量 = 两个指针的距离 * min(两个指针的高度)轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。
2025-11-08 22:23:23
127
原创 LeetCode(python)——15.三数之和
先排序,避免重复处理元素;再遍历三元组中的第一个值,第二个和第三个值使用双指针寻找。使用双指针,一头一尾,如果此时寻找的第二个值与前一个第二个值相同,则跳过;如果此时第一个、第二个值和第三个值相加大于0,则移动尾指针;如果此时头尾指针相遇,则直接跳出循环(找完了!如果此时相加等于0,则存入答案输出。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。(2)遍历(注意查重)
2025-11-08 22:08:17
341
原创 LeetCode(python)——283.移动零
让right指针去寻找非零元素,即和left所指位置交换的元素。让left指针表示零所在的位置,即需要进行交换操作的位置。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。,编写一个函数将所有。
2025-11-06 20:20:34
123
原创 LeetCode(python)——128.最长连续序列
1.遍历数组,看当前值是否可能是连续序列的开头(查找当前值-1,是否在数组中,如果在,那必不可能是连续序列的开头)接着查找当前值+1,当前值+2.....是否在数组中,边查找,边计数、,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。最长数字连续序列是 [1, 2, 3, 4]。3.找到一个完整的连续序列后,与上一次找到的比较长度,取max。2.如果不是开头,就不管,跳过;请你设计并实现时间复杂度为。给定一个未排序的整数数组。
2025-11-05 21:23:53
146
原创 LeetCode(python)——49.字母异位词分组
计数,互为字母异位词的两个字符串包含的字母相同,故可以将每个字符串中出现的字母次数以字符串的形式表示,作为哈希表的Key值。由于只包含小写字母,故用大小为26的数组即可。对字符串数组中的每个字符串排序,以这个排序作为Key值,当两个字符串的排序相同时,存进同一个列表。给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。在 strs 中没有字符串可以通过重新排列来形成。是字母异位词,因为它们可以重新排列以形成彼此。是字母异位词,因为它们可以重新排列以形成彼此。
2025-11-05 21:16:01
238
原创 LeetCode(python版)——1.两数之和
因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。遍历数组,用target减去当前值,查找差是否在除i之外的数组中(),在的话就找到了答案,返回答案对应的下标。整数,并返回它们的数组下标。你可以按任意顺序返回答案。——nono,求差!,请你在该数组中找出。
2025-11-05 20:56:11
267
原创 GitHub使用技巧——上传本地项目
2.GitHub限制单个文件的大小不能超过100M(有待解决,我是直接删…3.最后需要注意,不要直接crtlc、crtlv,会莫名奇妙多出一些无法识别的字符~打开命令提示符(以管理员身份),执行:ipconfig /flushdns。1.使用代理:git无法直接连接到github,需要让git通过代理连接。(1)检查系统hosts文件(以管理员身份打开记事本)(1)在本地找到需要上传的项目,进入终端。(3)让Git使用代理连接GitHub。(2)选择所创建的仓库是公开还是私用。(3)这两个可以默认设置。
2025-10-28 15:27:27
459
3
原创 PyCharm连接远程服务器(新手小白版)
作为一个新手小白,刚进组,看了一篇论文,准备大刀阔斧地跑跑实验代码,结果发现自己电脑的配置根本跑不动!(2)连接成功之后,会自动跳转到下面的页面,在这里可以通过Linux命令创建自己的文件夹(然后在这个文件夹下面创建自己项目的虚拟环境,安装就行)Sync folders:本地的这个文件夹,要映射到远程的哪一个文件夹下(先在服务器上创建一个你需要存在项目的文件夹,再点击右边选择)打开终端很有可能是这个,PS是Windows特有的,点击蓝色向下箭头,选择刚刚配置好的终端,然后。
2025-07-22 14:31:42
278
原创 P8805 [蓝桥杯 2022 国 B] 机房
2.dfs(int x,int father)更新f[][](表示节点 i 的第2^j个祖先节点)、d[](深度)1.n台电脑用n-1条网线相连,任意两个节点之间有且仅有一条路径(拆分成各自到公共祖先节点的路径——lca);若不相等,则从大到小,如果f[][]不等,则更新两点,lca=f[x][0]朴素求法的改进版(朴素是一步一步跳,倍增是用f[][]优化,每次向上都是以其父节点为目标)(1)先将两点跳到同一深度(深度大的往上跳)(2)for(1~20)更新f[x][i](1)更新d[x]和f[x][0]
2024-05-15 21:08:26
606
2
原创 P8803 [蓝桥杯 2022 国 B] 费用报销
2.对天数进行排序,准备一个数组op[](保存距离第 i 张票据最近且间隔天数大于K天的票据编号),在DP中作为不选的方程来源(f[i][j] = f[op[i]][j-v]+v)具体做法:将每张票据给出的日期转换为在这一年中的天数,准备一个前缀和数组s[],记录第一个月到第i个月的天数,日期(m,d)= s[m] + d。2.对于第 i 张票据可选,那么选的上一张即第 i - 1张票据的日期应该在第 i 张的前K天。题意分析:从N张票据中选,且总价值不超过M的票据的最大价值(背包问题) + K天限制。
2024-05-11 19:46:37
733
1
原创 P8802 [蓝桥杯 2022 国 B] 出差
注意:优先队列默认大根堆,故要重载 <;且优先队列按优先级排序,对于 < 而言,a < b为true的意思是,右边的优先级大于左边,故应为return a > b;3.从源点开始,更新源点到与其邻接的点的距离,每次选出dis[]min且未访问的点进行重复上述步骤。很明显:单源最短路径 + 没有负权边 = dijkstra。2.邻接矩阵存图 + 一重循环(高举y总大旗!1.链式前向星存图 + prioroty_queue。dis[]:更新源点到各个点的距离。vis[]:标记是否访问。
2024-05-10 19:55:34
538
原创 P8801 [蓝桥杯 2022 国 B] 最大数字
1.a 操作:+1;b 操作:-1,对一个数位同时使用a和b,相当于不使用,故对一个数单独考虑使用a 或使用 b。思路:题目的意思,要让一个数最大,用贪心去考虑,从高位开始,对其进行a / b操作,使其变为9,可让该数最大。(1)当前数位的数是 x ,贪心一下,将其变为9,需要t = 9 - x次 a 操作。(1)贪心,将x变为9,对于b操作而言,只要在为0时,才能变成9,故需要的次数。(2)不够,那就不使用b,不然数反而变小。(2)剩余的 a 操作小于 9-x。(a、b可以不用完!
2024-05-07 18:46:55
367
原创 P8800 [蓝桥杯 2022 国 B] 卡牌
Y:定义一个变量,加上x - a[i](对于第 i 种牌,凑齐x套需要的空白牌数)判断x - a[i] <= b[i](对于 i 种牌,假设把空白牌用完,是否能凑齐x套)(2)判断需要的空白牌是否超出题目给的范围(if(s <= m))注意:一定一定一定记得开long long.....“最多” -- 二分。
2024-05-06 21:17:48
486
原创 P8799 [蓝桥杯 2022 国 B] 齿轮
2.倍数为1,单独处理(在输入数组时,若存在b[x]>=2,即至少存在两个相同的数,说明查询倍数为1时能找到答案)最右边的齿轮的转速是最左边齿轮的q倍 == 最右边的齿轮的半径是最左边齿轮的q倍。题目范围:查询次数q:2*10^5,数组范围2*10^5,所以不能边输入边查询。题意即为:查询数组中是否存在两个数,其中一个是另一个的q倍。预处理倍数数组ans[],查询时直接得出答案。1.遍历数组,看其 j 倍数是否存在。
2024-05-05 20:51:33
589
原创 P9422 [蓝桥杯 2023 国 B] 合并数列
当a < b,把a加给其后一个元素,弹出a。当b < a,把b加给其后一个元素,弹出b。当两个队列队首:a == b ,弹出。
2024-05-03 21:42:15
773
原创 蓝桥杯2023国B
情况2.3是一样的,但是对于2而言,只要>2,超出的部分必须都要修改;对于情况3,可以只修改一半的数量,如:1 2 2 2 2 3,a[4]、a[5]必须都要修改(因为对于2而言,已经有一对id=2出现了);当情况3的个数 > 情况2的个数,cnt += (情况3-情况2)/2+情况2。2.当a[id] > 2,需要改变的个数是a[id] - 2个。当情况3的个数 <= 情况2的个数,cnt = 情况2的个数。3.当a[id] == 1,需要改变的个数是1个。题目要求的是与 i 对应的是唯一的 j。
2024-05-03 20:50:53
521
原创 P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数
由于x = p^2*q^2,需要找的素数范围为sqrt(23333333333333)又由于p是素数,最小为2,故q最大为sqrt(23333333333333/4)当前数字为2时,处于dp[0],或者和dp[1]结合成dp[2];根据子序列:2,20,202,2023分为4个状态;m是表中最小的数,m就是素数,将表中所有m的倍数划去。当前数字为0时,和dp[0]结合成dp[1];当前数字为3时,和dp[2]结合成dp[3]2是最小的数,将表中所有2的倍数划去;3是最小的数,将表中所有3的倍数划去;
2024-05-02 21:33:46
1838
原创 洛谷题单-美国血统
2.通过前序找根节点、用这个根节点在中序中分左右。3.递归处理(重复步骤2),最后输出root即可。学到新知识:(有关字符串的各种处理)已知前序遍历和中序遍历,求后序遍历。1.后序遍历:左右根。
2024-04-26 21:31:42
238
原创 二叉树的存储方式
自上往下、从左至右给每个节点编号(适用于完全/满二叉树,否则空间浪费太多)对于i节点:其父节点(i/2),左孩子(i*2),右孩子(i*2+1)当题目未告知父子关系时,仅直到x y之间有边,把树当图存储,建双向边。当题目只给出了左右孩子节点,可以直接用二维数组存储,不必建树。数据域、左孩子指针、右孩子指针、(父节点指针)son[i][0]:i 节点的左孩子。son[i][1]:i 节点的右孩子。3.二维数组直接存储。
2024-04-22 21:33:22
286
原创 21年天梯赛L2-2
L2-2 病毒溯源病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。
2024-04-15 21:50:36
333
1
原创 倍增LCA
一、前置知识:1.用链式前向星存储图2.dfs二、思想:1.寻找两个节点的公共祖先的朴素做法:从这两个节点向上遍历所有节点(dfs)但是在有多组询问时,时间复杂度大到爆炸...2.既然一步一步找太慢了,无法承受,那么才有二进制思想,每一次都往上走2的次方,于是...3.准备:两个数组(1)f[i][j]:i 节点向上走 2^j 步的祖先节点的编号(2)d[i]:i 的深度。
2024-04-10 21:25:11
182
1
原创 图存储的三种方式
适合稠密图O(V^2)对于权值:(1)有权图:INF表示不存在边、值表示权值(2)无权图:0表示不存在边,1表示存在边对于有向图、无向图:(1)有向图:存一遍(2)无向图:存两遍g[i][j] = g[j][i]
2024-04-09 21:38:35
439
1
原创 并查集算法
1.并查集:用于解决元素分组问题,管理一系列不相交的集合2.两个关键函数:合并 + 查询3.思想:f[i]:存i的父节点,令根节点的f[i]等于其本身合并时,将其中一个根节点的父节点设为另一个节点的根节点即可查询时,根据f[]判断,f[a] == f[b]
2024-04-09 20:53:02
242
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅