- 博客(42)
- 收藏
- 关注
原创 代码随想录算法训练营day52|单调栈01
也可以直接模拟重复,用i % nums.size()来操作。**注意 栈内元素为元素的下标。可以先用拼接再resize。
2024-12-11 19:59:56
247
原创 代码随想录算法训练营day51|动态规划part13
而我们发现,判断一个子字符串(字符串下标范围[i,j])是否回文,依赖于,子字符串(下标范围[i + 1, j - 1])) 是否是回文。回文子串这里的递推式不太一样,dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。所以要回归到回文的定义。combination 组合 无顺序 就是分成几个组的问题。组合就先遍历物品,再遍历背包,就能保证一种组合只出现一次。涉及到多个状态的动态规划如何实现?排列要先遍历背包,再遍历物品。会有一道树形dp问题(复习)
2024-12-09 20:36:37
225
原创 代码随想录算法训练营day49|动态规划part11
其实求最大不相交数,就是一个从前到后的遍历顺序的问题,那就是两个相等的字符的相对顺序不变,那不就是求字符串的最长公共序列。用动态规划求解,也就只有两个状态:dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和。这个与上篇笔记最大的不同就是子序列里的数可以不相邻,那么只需加入一个dp[i][j]的上和左的更新方向即可。本题尝试过用贪心求解,则只在当前元素为正的情况下去累加连续和。nums[i],即:从头开始计算当前连续子序列和。
2024-12-04 22:03:03
265
原创 代码随想录算法训练营day48|动态规划10
dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。(特别注意: “以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串 )确定dp数组(dp table)以及下标的含义。
2024-12-03 22:59:04
202
原创 代码随想录算法训练营day46|动态规划09
之前是最多只能完成两笔交易,现在是至多可以买卖k次,那么状态数需要定为2*k+1种,此时,就要分析多种情况的递推式。动态规划理解起来比贪心简单很多。找到奇偶数交替的规则即可。只需加一个扣手续费即可。
2024-11-26 22:47:51
337
原创 代码随想录算法训练营day 45|动态规划08
之前贪心算法有提到过,我们算正区间的总和,只要是正区间就加入总和。思路竟然和之前做过的一个斐波那契四季果树问题类似。
2024-11-23 00:22:07
179
原创 代码随想录day44算法随想录|动态规划07
成环了,即首尾元素不能同时选1.在考虑首元素,不考虑尾元素的方式下算最大值;挺简单的,但为什么这道题不能把奇偶位的都提出来加一遍,直接max比较呢?如果直接回溯递归,一直实时计算,就容易超时,所以可以采用树形dp。最后两种情况中取一个值最大的。
2024-11-20 18:49:33
327
原创 代码随想录算法训练营day43|动态规划06
和上题完全是一样的,初始化也和上题一样,dp[0]=0,其他的为INT_MAX,另外这题没有凑不出来的n的情况,所以始终返回dp[n](因为始终有1来凑)如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。这里求的是能组成总金额所需要的最少硬币个数,所以排列和组合都无所谓。
2024-11-18 17:37:02
293
原创 代码随想录算法训练营day41|动态规划04
返回剩余最后一块石头石头最小的可能重量,那么就应该最后剩余的两块石头尽量都等于或接近总重量的一半,这样剩下的就是一半的质量。
2024-11-16 21:51:23
410
原创 代码随想录算法训练营day39|动态规划02
如果采用数论的方法,要及时除分母,否则会两个int相乘溢出。不能把算式的分子都算出来,分母都算出来再做除法。
2024-11-05 23:53:42
307
原创 代码随想录算法训练营day37|动态规划01
注意:题目中说了n是一个正整数,题目根本就没说n有为0的情况。所以本题其实就不应该讨论dp[0]的初始化!从dp【1】,dp【2】开始初始化即可。常见的用到动规的题目:斐波那契、背包、打家劫舍、股票、子序列。1.确定dp数组以及下标的含义。3.dp数组如何初始化。
2024-11-04 15:57:10
162
原创 代码随想录day33|贪心算法03
此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!局部最优可以推出全局最优,并找不出反例,那么就试试贪心算法!局部最优可以推出全局最优。
2024-10-30 18:17:36
199
原创 代码随想录算法训练营day31|贪心算法01
本应是(prediff<0&&curdiff>0)+(prediff>0&&curdiff<0)平坡可能出现删除后(prediff=0&&curdiff<0或者prediff=0&&curdiff>0的情况)这里的报错是因为越界访问 if里还需要增加&&index>=0。只在摆动的时候更新prediff=curdiff。默认最右侧有一个最大值。
2024-10-27 20:49:26
295
原创 代码随想录算法训练营day27|回溯算法part02
startindex是什么,就是从集合中的哪个位置开始取,注意组合是不考虑顺序的哈,排列新的顺序才是新的一个结果如何判断同一层数组是否有相同元素,用bool型号的used数组,而不用map等,容易超时,而且因为之前已经排序过了,所以只用比较邻近的两个即可substr形式 : s.substr(pos, len)
2024-10-22 15:52:04
166
原创 代码随想录算法训练营day18|二叉树part6 二叉搜索
利用二叉搜索树的性质,中序遍历转化为有序数组,再遍历一遍数组即可简化代码,在中序遍历的时候就直接计算,那就用一个pre指针就可以实现了用一个count记录当前值,一个maxcount判断是否需要更新众数值即可二叉树回溯的过程就是自底向上的查找
2024-10-07 22:09:15
227
原创 代码随想录day15 二叉树part3
但这里我还是不明白,用针对普通二叉树的方法和针对完全二叉树的方法这两者的时间复杂度能差多少。用leetcode看跑的时间都差不多 针对完全的可能还要慢一点。递归算法的时间复杂度本质上是要看: 递归的次数 * 每次递归中的操作次数。
2024-10-06 15:19:20
174
原创 代码随想录算法训练营第十一天 | 二叉树基础
cur这里是作为指针出现的,来解决当前遍历到的点与加入result中不一样的情况。存储方式,链表存储或者数组存储。
2024-10-02 12:43:20
128
原创 代码随想录算法训练营第十天 |栈与队列进阶
先入栈一个元素,再准备入栈一个元素,如果上一个元素小于下一个元素,那上一个元素就没必要保持维护了,直接出栈即可。本题如果调用C++库map和priority_queue就不难 但要熟悉库函数用法。第一时间想到是暴力 外面n次里面k次,很明显10的5次方乘10的4次方,超时了。这里有一些不理解,private里定义public?同时,这里要使用自己的定义函数以比较map数组,注意,是后弹出来的去除以前面弹出来的。逆波兰表达式其实就是后缀表达式。题目里也是用的双引号。
2024-09-26 18:20:22
285
原创 代码随想录算法训练营第八天 |字符串进阶
=注意 这个reverse函数,reverse(s.begin().s.end())从头到尾 reverse(a,b)就是颠倒了(s[a]到s[b-1])中的。这个思路是题目一算法的升级 反转+反转 负负得正的思路真的很难想到 但一下子也就变的很简单 完成了题目一之后却没能延伸想到这道题的思路 实在是没吃透精髓了属于。找字符串s的过程可以直接用库函数find(s),但其中的复杂度比较高。最长相等前后缀不包含的子串是字符串s的最小重复子串。一是前后缀相等 二是源字符串对应的位置的字符相等。
2024-09-24 22:32:01
386
原创 代码随想录算法训练营第七天 |字符串函数
先count一下数字的个数,然后扩充字符串数组,双指针后面的指向最末尾往后的一个。其实就是一个++i变为i+=(2*k)双指针直接实现,而不需要新开一个数组。特别好的算法思路,值得记录一下。可以直接用reverse函数。
2024-09-20 14:00:05
223
原创 代码随想录算法训练营第五天 | 哈希表入门
这里的异位词,指字母出现和出现的次数都一样,可以利用ascii的机制简单求解,使用数组求解即可。而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。为了避免双重循环,所以其中一次循环用哈希代替,用空间换时间。*报错:如果出现utf8的报错,即说明出现了中文字符。此时就要使用另一种结构体了,set。
2024-09-17 18:25:13
196
原创 代码随想录算法训练营第四天 |链表进阶
非常巧妙的思路,既然要删除倒数第二个,就让fast指针首先优先slow指针n步,再同时移动到末尾直到fast指针指向nullptr,这里用n+1步是为了更方便删除结点。解决问题一的方法十分巧妙,是追逐相遇问题的解法,即一个节点一个节点的靠近slow。*显示10行之外的野指针报错,竟然是因为这里的&&符号达成了&cur->next->next->=下下下一个元素。cur->next->next=下下一个元素。解法太精妙了,数学和编程的完美结合。cur->next=下一个元素。如何使用一遍扫描实现?
2024-09-17 17:12:16
312
原创 代码随想录算法训练营第三天|链表题目基础
注意在删除结点过程,如果用tmp借代,最好后面把tmp赋值nullptr;如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。
2024-09-16 15:07:14
206
原创 代码随想录算法训练营第二天| 数组及二分查找进阶
若未被赋值取最大则等于 int result = INT32_MAX;报错:很常见的错误,最后一排应该是双等号。
2024-09-16 11:47:13
270
原创 # 代码随想录算法训练营第一天| 数组及二分查找。
今天是代码随想录学习的第一天,我的目标是在60天内刷完典型题,以期在蓝桥杯中获得好成绩,首先我需要重新熟悉一下leetcode的代码编写方式。
2024-09-15 22:19:10
206
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人