- 博客(42)
- 收藏
- 关注
原创 跨考准备机试遇到的一些题目|备忘录|更新ing
/数据量很大,如果用vector挺容易超时的。思路就是线性筛(艾式筛可能会超时)。线性筛的核心思想就是每个数只会有一个最小质因数,所以用质数的数组Prime去反推每个数。所以时间复杂度是on。//看得我头都大了。题解用的是静态数组做成的邻接表。我实在是没办法运用好这个。于是看了半天思路,改用结构体来辅助理解了。如果采用cincout输出可能会超时。//这题力扣上有,但是南大的这个题对时间和空间有更高要求。//二进制枚举,之前没写过的类型。我也很少用过按位运算符。
2025-03-12 15:14:12
203
原创 代码随想录算法训练营 | 图论 | Ford算法以及判断负权回路、SPFA算法优化ford、单源有限最短、Floyd算法
/这题有负权回路,而且还得输出正确的路径权值。所以思路是循环k+1次,同时借用上一轮循环的minDir数组。没有完全按卡尔那个来。不考虑题目要求,初始值改为INTMAX更合适,只需要循环中增加判断即可。//需要检测负权回路。只需要修改一下Ford里面的循环判断即可。
2025-03-10 13:44:09
201
原创 代码随想录算法训练营 | 图论 | 冗余连接、prim和克鲁斯卡尔算法
/这种题主要还是不看思路很难将题目要求转化为代码解决。第一次我只想到入度等于2的时候肯定是要删除的边的元素。不过成环那个没考虑到,所以并查集的那个代码后面再补上的。//prim算法代码如下。卡尔那个预设10001。可以改为INT_MAX。只需要将mindir【1】改为0即可(或者改需要先纳入的节点)//需要想到当新加的元素成环的时候,必然属于同一个集合。//克鲁斯卡尔代码如下。
2025-03-07 15:40:22
147
原创 代码随想录算法训练营 | 图论 | 字符串接龙、有向图的完全可达性、岛屿周长、寻找存在的路径
/这个一开始以为是要比较字符串的距离。然后看了下思路,原来也还算是挺直接的。就是每个字符都用26字母改一遍。如果发现和某个字符串一致。那么就将该字符纳入map里。直到符合endstr为止。对我来说,难点在于解法以及所需的容器很难想到。//没什么难度,就是单纯遍历一遍罢了。//BFS,没用并查集。
2025-03-07 00:43:59
189
原创 代码随想录算法训练营 | 图论 | 孤岛总面积、沉没孤岛
/思路大致是,先遍历边框的,然后递归把连着的陆地都扫过,最后把没扫过的且为陆地的改为0。最后按题目的要求输出。//思路大概是先计算面积,然后如果有接触路面就返回false。可能稍微多余算了太多无用面积。
2025-03-05 14:35:48
520
原创 代码随想录算法训练营 | 单调栈
之前哪道题讲过单调栈来着。反正这题懂单调栈就能a,没什么难度。直接跑两次,然后用余数区分一下即可。写完一看思路差不多。虽然和接雨水有异曲同工之妙,但是边界处理比雨水要复杂一点。如果要用单调栈的话,实现起来并不算特别简单。难点在于知道单调栈之后如何妥当的计算面积。
2025-03-02 22:48:26
231
原创 代码随想录算法训练营 | 动态规划:part08 | 不相交的线、最大子数组和、判断子序列、不同子序列、两个字符串的删除操作、编辑距离
贪心中写过一次,贪心的思想是只要和没小于0,就接纳下一个元素。如果小于0了,说明之前的连续序列是负担,抛弃掉。dp的含义是以nums[i]为结尾的最大连续序列和。编辑距离这听起来有点怪,距离这词和海明距离的距离意思差不多。dp定义为ij时的编辑距离。可以转化为求最长公共子序列,也可以直接将dp数组定义为俩字符相等的时候至少的删除次数。即:dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];时间复杂度其实比双指针高。等同于求最长公共子序列,题目转化为抽象算法的思想很重要。
2025-03-02 00:44:26
239
原创 代码随想录算法训练营 | 动态规划:part07 | 最长递增子序列、最长连续递增子序列、最长公共连续子序列、最长公共子序列、
此外,还有时间复杂度更低的方法。大概是维护一个递增数组,如果遇到一个新的数小于数组结尾。如果比数组结尾大,那就直接增加数组。其精妙之处在于如果后续未能找到比这更长的递增子序列,也不会影响原来的数组长度。但是如果能找到更长的递增子序列,前面的一系列替代则更能获取到增加的元素(因为尽可能的让数组元素变小)。这题还是瞄了眼思路的。需要想到定义要改为以(0,i)(0,j)为范围的公共最长子序列。没看思路写的,写完看了下思路和我差不多。其实只要确定dp的定义和状态转移的式子,剩下的就是水到渠成了。
2025-03-01 10:15:00
155
原创 代码随想录算法训练营 | 动态规划:part06 | 买卖股票问题
原理继承前面的题,只是需要多设计两种情况。dp的含义比较抽象,需要多琢磨才能领会。才发现贪心算法那里写过,这里写个动态规划的。
2025-02-28 18:41:32
140
原创 代码随想录算法训练营 | 动态规划:part05 | 多重背包问题、打家劫舍问题
一开始走误区了,以为要将父节点和爷节点的状况传递进去。看了下思路才知道怎么写。但是dp[1]得取0和1的最大值。//还是有点忘记那些背包在不同需求下导致的不同写法了。原来要分两种情况各自dp即可。来自代码随想录里的各种背包的图片总结如上,很详细。
2025-02-27 13:37:19
135
原创 代码随想录算法训练营 | 动态规划:part04 | 零钱兑换、完全平方数、单词拆分
看了代码才写出来的。虽然递归公式知道,但是还是有点不求甚解。求最小值的初始值都要设为INT_MAX吗?题外话:四平方和定理可以更快的时间复杂度完成。转换为背包的思路有点难想到。
2025-02-26 00:35:43
199
原创 代码随想录算法训练营 | 动态规划:part03 | 目标和、一和零、零钱兑换、组合总和
/中等,没写过还真难想到。将sum=left+right和target=left-right联立,left=(sum+target)/2,就转化为一个背包问题了。值得注意的是这题int会溢出,longlong也不够,得加个unsigned才行。求排列数量的背包题,最好使用一维数组。尽管看起来这种题的一维数组写法仅仅只是换了下两个for循环的次序。但是在二维数组,仅仅换次序是不行的。补充:完全背包的一维数组需要正序遍历,正是因为他这种可以无限选取的特性。后面的这个是没办法表达出这个是加了i元素之后的排列。
2025-02-24 02:24:12
253
原创 代码随想录算法训练营 | 动态规划:part02 | 不同的二叉搜索树、背包及延申题
/0-1背包问题。第一次写,看下思路,感觉最需要理解的是dp的定义。掌握了dp定义和递归,后面其实就很好写了。改为一维数组的思路能理解,但是感觉降低了可读性。写了个和上一题没什么差别的代码。搞清楚dp之间的关系就简单了。
2025-02-23 02:21:15
172
原创 代码随想录算法训练营 | 动态规划:part01 | 爬楼梯、不同路径、整数拆分
这个不看思路还真不知道怎么写。看了之后就明白,只需要拆分两个即可,乘积的左右各为max(dp[j],j)。虽然实际上当拆开的数大于等于4的时候,就不需要再乘以拆开的数字了,而是直接乘以dp【该数字】虽然多个障碍物,但是我们可以发现假如临近点有障碍,那么设为0即可保证不会从该点过来。题目本身没什么难度,注意边界。//加强版的爬楼梯。
2025-02-22 13:42:24
231
原创 代码随想录算法训练营 |贪心算法:part04|划分字母区间、合并区间、单调递增的数字、监控二叉树
注意到处理数组这段,没有写等于的情况。因为当相等的时候,如果后面有下降,还是得从firstmax往后开始归零0,如果没有下降,则不用改。看了下卡叔的思路,也比较类似,他是从后往前遍历,当遇到最前的一个递减的时候就记录一个flag值,从这里开始往后改为9。写完发现不知道怎么处理等于1的情况。就干脆从头遍历起了。这就是屎山的第一步。没看思路,感觉能写,一写就是快一小时。不过自己边琢磨边改,对这题理解就更深入了。就是先遍历一遍记录每个字母的最远点即可。
2025-02-21 23:39:02
232
原创 代码随想录算法训练营 |贪心算法:part03|根据身高重建队列、最少数量的箭引爆气球、无重叠区域
这题正好和上题相反,所以把上一题的代码抄下来,把if条件内的大于等于改为大于(因为[1,2]和[2,3]算不重叠)。最后return 数组size()-result即可。先按第一位元素的大小排序。然后箭头贪心的选择最右端点。如果新的节点的左端点超出原来的右端点,就加一条箭。贪心在于遇到20美元优先找10美元和5美元即可。
2025-02-21 16:32:09
198
原创 代码随想录算法训练营 |贪心算法:part02|跳跃游戏I和II、K次取反最大数组和、加油站、分发糖果
第一种情况:当costcount大于gascount时候,必然没办法跑完。第二种情况,能跑玩,且submax大于等于0时,说明从0跑到终点,剩余油量都0以上。第三种情况则是submax小于0,说明中间有一段最低值使得从0开始是没办法跑完,但是整体gascount是大于costcount的说明必然有办法跑完。那么从理论上来说,从某个点跑到结尾,再从0开始跑是能填补的。我的思路是不实时更新maxcov,改为在一段cover内计算最大maxcov,然后再更新,并且跳跃数+1。只不过这里算的是差值的和。
2025-02-20 20:42:56
446
原创 代码随想录算法训练营 |贪心算法:part01|分发饼干、摆动序列、最大子数组和
有个错误思路是判断根据连续坡或者平地,然后相应减去该点来判断,但是会因为很多特殊情况导致出错。然后根据波动来增加峰顶的思路相对容易想到,但是不够全面。代码里有一个很难想到的思路。贪心算法的核心理念:局部最优——>全局最优。因此只有当局部最优能推导全局最优的时候才能用。根本不需要考虑什么贪心。单纯的遍历一遍差值,然后只加正数就行了。
2025-02-20 02:45:50
148
原创 代码随想录算法训练营 |回溯算法:part04|重新安排形成、N皇后、解数独
当结果唯一时最好使用带返回值的函数,方便找到一个解时立刻结束函数并返回。看过思路也容易下手。
2025-02-19 03:51:04
301
原创 代码随想录算法训练营 |回溯算法:part03|递增子序列、全排列问题、
这个数组因为不能做排序,因此去重的写法要换成哈希表去替代。(已知数组的值范围,用固定数组代替哈希表时间更短)即可发现去重思路和之前的是一样的,都是同行检查。用哈希表做同行检查used(↑可以不做排序)。写完看了下思路原来不用写start。
2025-02-17 20:24:39
174
原创 代码随想录算法训练营 |回溯算法:part02|分割回文串、复原IP地址、子集问题
对于回溯的处理时机需要深入理解。一开始写怎么也想不出怎样处理如何进一步迭代和进一步选取字符的关系。做过组合总和II就会这个。牢记修剪关键思路,修剪同层还是修剪同树枝。动态规划的思想还是挺难想的。只能先抄一遍,后面二刷再巩固了。以下为不采用动态规划预先判断回文串的方法。该代码代替上面的bool函数即可。
2025-02-17 16:18:18
165
原创 代码随想录算法训练营 |回溯算法:part01|各种组合问题
该算法生成的序列是类似于123..k-1k、123..k-1k+1、123..k-1k+2一直到123..k-1n这样。一个是构建数字映射表,另一个是字符串的数字提取出一个int变量。前面会了后面就会,最多就是剪枝没剪好而已。
2025-02-16 00:41:15
126
原创 代码随想录算法训练营 |二叉树:part06|搜索树中的插入、删除、修剪、有序数组转换为搜索树、搜索树转换为累加树
写的时候发现死活通不过,丢ai稀里糊涂说了一大堆,最后提到可能测试框架会访问已经被删除的节点。只要求搜索树的话,那是没什么难度的。真正有难度的都是平衡树红黑树。如果会上一题,那么这一题应该没什么难度。看完视频清楚思路,知道各种情况之后写出来不难。理解题目之后就没什么难度了,右中左遍历就行。
2025-02-15 02:31:20
119
原创 代码随想录算法训练营 |二叉树:part05|合并二叉树,二叉搜索树相关题,最近公共祖先,排序树的最近公共祖先。
和上一题思路类似,无非是多一个指针。和二叉搜索树的搜索没什么区别。
2025-02-14 14:27:55
221
原创 代码随想录算法训练营 |二叉树:part04|中后序数组构建二叉树。最大二叉树
用类似上面那道中序后序构造二叉树差不多。但是如果要写出On级别的代码,需要用到单调栈,难度有点高。基本是抄力扣官方题解的。后面单调栈熟练了再二刷吧。
2025-02-13 14:08:23
151
原创 代码随想录算法训练营 |二叉树:part03
没看思路,没想到写了很久。一开始是打算设置一个变量road。当要设置一个新路径的时候复制之前的路径,然后发现如果在递归前预设公共路径,那么你不知道在哪个索引下标位置赋予。如果递归中复制的话,又没有办法找到之前的公共路径。改为传递公共字符串。如果节点是叶子节点才push_back。层序遍历加个判断即可(话说都没考虑回溯。感觉略微脱离了卡叔的本意了。递归传递的是节点所在的高度。用-2作为特殊值传递不平衡的特殊情况。用所有路径的代码改一下就行。
2025-02-12 02:02:12
192
原创 代码随想录算法训练营 |二叉树:反转,镜像,最大最小深度,完全二叉树的节点个数。
代码本身还是容易理解的。但是关键在于这个时间复杂度为什么是logn^2呢。这是因为他其实是有一点二分查找的意思在里面。至少有一个左子树或者右子树是满二叉树的。那么代码就不会再深入遍历他的子树的节点了。和最大深度写法一样,初始值改为INT_MAX,floor比他小的时候赋给floor即可。双指针,分别指向对称的节点,比较之后,往容器存入对称的节点。
2025-02-10 23:51:36
216
原创 代码随想录算法训练营 |二叉树:遍历
迭代遍历里,后续遍历 用先遍历 中 右 左 的方式,再对调结果数组的思路比较容易写。中序遍历啧略复杂一点点。其他两个差不多,换个次序而已。
2025-02-10 03:11:16
189
原创 代码随想录算法训练营 |栈与队列
还有一个细节是如何排出窗口左侧的元素。并不是让队列长度控制在k,而是通过比较前端是否和数组的前k位相等。若相等则说明前k位是上一个窗口的最大值,需要从队列排出。则说明当前位到前k位的元素有一个比他更大的元素,则前k位的元素早就被排出了,无需处理。首先,尽管要确保队列内的元素降序排列,但是当窗口移动到新的元素时,不需要保留比当前元素更小的值,即通过连续比较队列后端实现。//写半天发现原来标准操作pop是不返回只移除的。//偷懒了,求top直接返回队列的back函数了。如何优雅的处理好字符串。
2025-02-09 14:30:31
255
原创 代码随想录算法训练营 |字符串+KMP
/简单。//简单。//中等。难点一个是消去空格,另一个是如何反转。消去空格的办法是双指针,当快指针指向非空格元素时元素赋予到慢指针,循环结束时增加一个空格。反转则是先整体反转,然后是当遇到空格时可以锁定一个单词的范围,将单词反转即可恢复原状。
2025-02-07 03:35:59
143
原创 代码随想录算法训练营 |哈希表part02
/中等,额外增加一个循环。这次的目标值是不固定的target变量。因此剪枝判断需要额外考虑。关键在于一个是如何识别出一个所需的序列,另一个是如何去重。有思路就好写,但是不容易想到。和有效的字母异位词差不多。
2025-02-06 01:57:49
258
原创 代码随想录算法训练营 |哈希表part01
卡叔这道题给的代码用了一些我不知道的技巧。研究了下发现还挺不错的。关键点在于map的运用。以及一些c++上的细节。构建长度为26的数组作为哈希表即可。关注点主要在处理每一位的乘积。
2025-02-04 20:12:56
134
原创 代码随想录算法训练营第六天 |链表补充——环形链表2
进入循环之前的那段写的有点奇怪,因为我退出循环的条件是相等,而起点一开始也是相等的。搞得我一开始不知道怎么办。就让他们先跑了一段。写完然后看了下卡尔的代码,和我if while的条件对调就行了。如果是第一次写,基本上都不会。因为思路相对有点巧妙。
2025-01-30 22:07:59
247
原创 代码随想录算法训练营第五天 |链表part02
因为如果有相交,他们后缀一定是相等的。那么设置两个指针,分别指向短的链表的头尾节点。再设置另一个指针,指向长链表的倒数为短链表长度所在的指针,短的头指针和长链表的标记指针同步遍历,如果遍历到某节点相等(该处的相等为节点相等,即指针指向的内存地址相等),就说明交点在这里。思想很简单,无非就是设置两个距离为N的节点。两个节点同时往后遍历,当后者遍历到尾节点时,前节点指向的自然就是倒数N个。显然注意到,对节点进行增删改查时,标记节点处于需要修改节点的前一个位置时修改才方便。这代码也是写的太冗长了。
2025-01-30 01:28:01
208
原创 代码随想录算法训练营第四天 |链表part01
因为各种边界条件,判断条件太容易出错。我是直接丢chatgpt检查的。//中等 链表常规操作。这些在考研初试经常使用伪代码,而实际写差距还是比较大的。PS:自己想的思路。和代码随想录的不太一样。后面二刷再用另一种思路写吧。翻转的思想在后续各种算法中也算是常用轮子了。
2025-01-29 01:28:59
151
原创 代码随想录算法训练营第三天 |长度最小的子数组,螺旋矩阵II,区间和,开发商购买土地
然后依次比较前缀和[n]和前缀和[M-n]的差值,选出最小的那个就是所求。//共同前缀和本身还是简单的,思想其实是空间换时间。这题我用了scanf和cincout两种不同的写法。发现这两个时间差距确实蛮大的。第一次写,只是看了思想没看代码。写了两个for循环嵌套结果发现不对。后面看了代码才知道第二个循环用while。该题目需要保持左闭右开的写法。同时需要注意奇偶矩阵的情况。而且我目前还没办法一口气写出一个茁壮又完全正确的代码。//用vector定义一个二维数组的写法。//同颜色代表一次循环遍历的数组位置。
2025-01-28 00:23:15
152
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人