- 博客(71)
- 收藏
- 关注
原创 算法复习|修剪二叉搜索树
总结:这道题还是有一定难度的,自己最初想的暴力方法是先遍历一遍搜索树,得到一个vector容器,再遍历容器,当出现在范围外的点时,使用外置函数将此节点删除,比较麻烦。递归解法:当出现在范围外的节点时,用两个节点各自接住左右两边在范围内的节点再返回这两个节点,从而达到删除当前节点的效果。接着,再用当前层节点root接住返回回来的左右节点,最终达到删除效果,接着返回root节点。
2024-04-05 19:25:43
332
原创 算法训练|乘积最大数组、最长有效括号
注意:dp[i - 1] + 2 + ((i - dp[i - 1]) >= 2?表示在形如'....))'这种情况下表示,倒数第二个括号如果是一个有效子字符串的一部分,且在这部分有效子字符串的前面有一个'('与倒数第一个')'匹配的话,那么此时的dp[i] = dp[i - 1] + 2,而在这个'(’之前可能符合条件的串,所以也加上dp[i - dp[i - 1] - 2]这一部分。总结:解题思路是需要维护一个最大值以及一个最小值,因为最小值如果是负数的话乘上接下来的一个负数会有可能成为最大的数。
2024-02-04 13:07:56
376
2
原创 算法训练|下一个排列
2、同时我们要让这个「较小数」尽量靠右,而「较大数」尽可能小。当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。1、我们需要将一个左边的「较小数」与一个右边的「较大数」交换,以能够让当前排列变大,从而得到下一个排列。总结:能读懂题目的意思,但是不知道如何下手。注:以上题解来自力扣官方。
2024-01-29 12:18:33
278
原创 算法训练|动态规划之背包问题复习
(2):当放物品i时,此时dp[i][j] = dp[i - 1][j - weight[i]] + weight[i],即放入物品i时,背包容量还剩j - weight[i]且此时就要从0 - i-1下标中找物品放入以及要加上i的价值。其实可以发现如果把dp[i - 1]那一层拷贝到dp[i]上,表达式完全可以是:dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);与其把dp[i - 1]这一层拷贝到dp[i]上,不如只用一个一维数组了,
2024-01-26 17:15:53
607
原创 算法训练|实现 Trie (前缀树)
指向子节点的指针数组 children。对于本题而言,数组长度为 26,即小写英文字母的数量。此时 children[0] 对应小写字母 a,children[1]对应小写字母 b,…,children[25]对应小写字母 z。布尔字段 isEnd\textit{isEnd}isEnd,表示该节点是否为字符串的结尾。(解释来源:leetcode官方)。,每个Trie指针都是指向一整个对象包括了vector和一个bool,而不是指向了vector中的某一个对象。
2023-12-24 09:59:29
523
原创 算法训练|随机链表的复制、K个一组的翻转链表
题解的思路非常棒,利用哈希表+回溯,因为不知道当前节点的next与random是否已构建,所以使用哈希表来判断;接着当我们构建完当前节点的值之后,利用回溯赋值当前的节点的next与random,最终返回当前节点,形成总体的递归。tail节点就是下k个节点中的头结点,完成当前k个节点的翻转后,pre节点就是当前翻转完后的头节点。总结:此题的关键是利用递归+翻转链表,直接看代码比较容易理解。
2023-12-11 11:15:25
423
原创 算法训练|解密数字、珠宝的最高价值
总结:这道题目正确理解题意后其实就是一个走楼梯有多少种方法的题目,只不过需要根据条件来判断f(n)能不能等于f(n - 1) + f(n - 2) 将数字转换为字符串之后,根据题意,若当前字符和前一个字符组成的字符串大于25的话则不能合并成一个字母,则f(n) = f(n - 1),若可以合并成一个字母的话则多了一种情况f(n) = f(n - 2),将这两种情况相加就是可以合并成一个字母的情况。接着初始化dp数组。
2023-11-01 21:18:57
186
原创 算法训练|数据流中的中位数
总结:这题自己最开始的想法是直接使用vector容器,每次取中位数的时候就进行一次排序,超时。题解很巧妙的利用大根堆和小根堆来解决问题,大根堆和小根堆各存一半的数,其中需要注意的是,小根堆里面存的是较大的数,然后堆顶就是这些数里面最小的数,大根堆里面存的是较小的数,堆顶就是这些数里面最大的数。这样就可以整体形成一个排好序的序列。
2023-10-29 21:28:50
190
原创 虚幻中的网络概述一
前置:在学习完turbo强大佬的多人fps之后发觉自己在虚幻网络方面还有许多基础知识不太清楚,结合安宁Ken大佬与虚幻官方文档进行补足。补充:官方文档中的描述挺好的,自己只算是搬运和将两者结合加强理解。学习虚幻中的网络先从虚幻网络的架构说起:先放上一张架构总结图。
2023-10-27 17:05:46
644
1
原创 算法训练|交易逆序对的总数、验证二叉搜索树的后序遍历
总结:这道题目难度比较大,整体上来说是利用归并排序的思想,在[并]的过程中加入操作得到目标数,题解部分解析:要注意的地方在于是当左边指针移动的时候我们就需要计算一次交易逆序对,不是右指针移动的时候计算是因为,当我们移动右指针时,说明左边的数比右边的大,右指针移动完成后其中间所跨过的数就是逆序对。总结:此题是利用递归方法来解决问题,容器中最后一个数即为根节点,进行循环寻找到第一个比根节点大的数从此数记为FirstMax开始即为右孩子树,而根据二叉搜索树的性质,在容器中在FirstMax之前的数即为左孩子树。
2023-10-26 21:42:15
319
原创 算法训练第六十五天|螺旋遍历二维数组
总结:本质是模拟一个螺旋的过程,其中关键是如何限制边界条件或者说是循环结束条件。题目要求是按从左到右、从上到下、从右到左、从下到上的顺序,所以可以设置循环来完成,然后对其中的边界进行界定。,在解题方法上也有些许区别,相同点是都是利用循环来完成,不同点是第一种更妙。这两道题目都比较相似,都是模拟一个螺旋的过程,主要区别在于。第二道题的螺旋矩阵一定是一个正方形。
2023-09-24 23:04:37
425
2
原创 算法练习第六十四天
总结:利用一个双端维护队列一个往后递减的队列,对头是最大值,每次进入一个新值时就一直和队尾元素比较将比新的值小的数排出,这样能保证留在队列中的数都是会对最大值产生影响的数,而当主队列中将要排出的数与双端队列对头数相等时则也要将双端队列队头数排出,否则会对主队列中最大的数产生影响。
2023-09-23 23:43:21
1813
原创 算法训练第六十三天|被围绕的区域
总结:和第1020道题目很相似,不过自己照着前面那道的题目的思路来并没有解决问题,这和自己没有完全理解题目意思也有一定关系,,边界中如果有为'O'的地方,则利用广搜或者深搜搜索出这一片区域则这一片区域都是不用改变,其余的再根据题意改成'X'即可。,自己利用之前的思路不能做到bug free,看完题解后觉得真妙,并没有设置利用visited数组,而是。直接先从四个边界判断起。
2023-09-21 21:41:47
111
原创 算法训练第六十二天
总结:还是利用广搜或者深搜,此题的重点是在广搜的同时需要记录下不能离开边界的数量,我的想法是利用一个count和一个bool来记录,如果在广搜的过程中发现有岛的下标在边界上的则bool为真,且将0加入vector中,否则将count累加,直至这一片搜索完成,最后再将vector中的数累加返回,其中容易遗忘的点是需要在将0加入vector之后要将bool设置为假,否则将会导致后面的一片区域都是bool为真而都是0;
2023-09-19 21:51:29
108
原创 算法训练第六十一天
总结:今日这道题自己使用暴力方法结果是超时了,看完题解后觉得实在是太妙了!利用哈希表与递归(答案中说是回溯,个人理解是递归),利用哈希表记录已经创建了的节点,如果没有找到就直接新创建节点,找到了就直接返回哈希表记录的值,而哈希表的键值就是原来链表中的节点,哈希表中的键值和值值非常对应,就是两个不同链表中的同一节点。
2023-09-18 20:56:11
298
2
原创 算法训练总结
无论无何,这都还是一个新的起点,以后会有各式各样的困难,一定要坚持努力,坚持下去,才会遇见一个更好的自己。整整六十天,基本无间断,中间有想过中断一段时间,但是仍然坚持了下来,也算是给了自己一个交代,坚持的力量是最大的,不是因为看见希望才坚持,而是因为坚持才看见了希望,前路依旧漫长,自己的努力并没有白费,只是仍需努力,仍需努力。从一开始的两数之和到最后的接雨水,中间各个板块都留下了自己的身影,也从中更加相信了自己,并不一定要有别人的监督,最重要的还是要看自己有没有坚持的决心,任何一方面都是。
2023-09-12 19:30:09
119
2
原创 算法训练第五十六天
总结:今日是编辑距离问题的结束,对编辑距离问题的总结是要抓住dp的定义以及如何推出dp数组来抓住问题核心,比如经典题目编辑距离:dp数组的定义是dp[j][j]是以i - 1为尾的word1和j - 1为尾的word2的最少改变次数能使两个字符串相等,dp[i][j]则可由以下几种情况推出:当word1[i - 1]和word2[j - 1]相等时,则dp等于dp[i - 1][j - 1],不相等时:(以下摘抄自代码随想录)这里有同学发现了,怎么都是删除元素,添加元素去哪了。, 最终的操作数是一样!
2023-09-05 20:15:10
111
原创 算法训练第五十三天
总结:之前利用贪心算法解决过一遍,这次利用动态规划来解决,思路其实还是一样的实现方式不一样。总结:仔细分析一下其实是和最长公共子序列一样的。1143.最长公共子序列。总结:还是子序列问题。1035.不相交的线。
2023-09-03 21:24:44
115
原创 算法训练第五十一天
总结:在买卖股票的最佳时机Ⅱ上多加了一个手续费,注意初始化以及递推公式中的变化就能完成此题。总结:此题解决关键要把不持有股票的状态解开成几种状态,因为多了一个冷冻期。
2023-08-31 19:44:33
94
原创 算法训练第四十八天
总结:第三道自己不太会,要利用二叉树的后序遍历来解决问题,从底向上,并且要将dp数组设置为两种状态,偷与不偷。总结:两种情况进行讨论,第一家偷或者不偷这两种情况。总结:今日刷了打家劫舍三道题。
2023-08-28 20:40:47
121
原创 算法训练第四十六天
总结:自己一开始想的利用回溯来解决但是也考虑到可能会超时,从动归角度入手,自己没有弄清楚dp数组的含义而导致没有正确解决问题,此题的dp数组是当字符串的子串长度为i时,dp[i]表示能否用给定字典中的串表示出来,此题是一个排列的完全背包。
2023-08-26 20:24:02
206
原创 算法训练第四十五天
总结:又是一个完全背包问题,自己这题的问题出在没有根据题意来初始化,只初始化了dp[1],因为感觉根据题意dp[0]不需要初始化导致错误。总结:也是一种完全背包,不过与昨天的区别在于这题是求最少所以选择min。
2023-08-25 21:34:51
128
原创 算法训练第四十四天
总结:此题根据题意是一个组合问题,自己一开始写错了地推公式,把两种目的的递推方法搞混了,一种是装满背包的方法,另一种是装满背包的最大的价值。此题是装满背包的方法。今日总结:今日两道题全是对完全背包的考验,需要注意的是完全背包问题中对物品和背包的遍历顺序,先遍历物品则是一个组合问题,先遍历背包则是一个排列问题。总结:这道题根据题意是一个排列问题,凭借自己对完全背包的生硬理解还是做了出来,不过没有想到会超出int范围。
2023-08-24 20:37:49
87
原创 算法训练第四十三天|一和零、目标和、最后一块石头重量
总结:此道题的解法在于要把取正号的和取负号的分成两部分,假设取正号的部分为left,负号部分为right,需要注意此处负号部分并不是意味right里面全是负数而是意味着在后面这一部分在计算时取负号,则left的和 + right的和等于总和,left的和 - right的和等于target(这样能满足题意获得target),所以将以上两个等式相加得到,left的和等于总和加上target 再除以2,还需要注意若最后总和加上target的和除以2余数不为0的话则找不到,因为left的和不可能为小数。
2023-08-23 22:54:06
95
原创 算法训练第四十一天
答案是利用当前的整数拆分可以分成两种情况来讨论,第一种情况,整数n拆成一个i,剩下的就是n - i,然后相乘结果就是i * (n - i),第二种情况,整数n拆成一个i,剩下的就是n - i,但是n - i继续拆分,也就是说需要得到dp[n - i]的拆分最大值,这也就是与前面的所求的dp值产生联系,进而利用状态转移方程也就是递推公式,不要忘记i也要进行遍历,从1到n,注意不是从0,因为从0开始就不是拆分成两个或两个以上的数了。总结:今日的动态规划题的代码量都很简单,但是整个思路过程都不简单。
2023-08-21 19:44:46
85
原创 算法训练第三十八天
总结:今日是动态规划的开始,自己之前也刷过一部分了,还算是有点经验。总结:此题自己没有注意到题目中的说法:你可以选择从下标为。导致自己的初始化没有正确接着一直错误。
2023-08-18 21:01:17
74
原创 算法训练第三十七天
总结:此题自己用的暴力解法,时间复杂度为O(n*m)结果超时,答案的想法很妙,从后面开始遍历,每两位数进行比较,若前面一位数比后面一位数大,则将前面一位数减一并将后面的数置为9,这样就可以保证递增的同时又是最大的,而将后面的数置为9的操作并不是减一的同时做的,而是先用一个下标记录最后停止减一操作的时候的下标,接着利用循环将这个下标之后的数全部置为9。总结:此题的解决方法不容易想到,把其节点设置为三种状态中的一种:已覆盖、有摄像头、未覆盖。
2023-08-17 20:49:31
89
原创 算法练习第三十六天
总结:此题有点妙,自己是没想到思路的,答案中利用数组将各个字母的最远出现的下标记录,接着如果满足条件就不断更新到达某一个字母的最远下标,这个下标要满足前面的字母元素不能在别处出现。总结:大体思路不难,可能需要花时间一些细节处理上,自己起初就是卡在没有考虑到如果后续的元素都是能重叠的话就会导致不能正确处理然后就放进结果数组。总结:此题应该是平台问题,题解时间复杂度为O(n^2),我的为(nlogn),但是我的答案超时了。
2023-08-16 21:17:06
90
原创 算法训练第三十五天|用最少数量箭爆气球、根据身高重建队列、柠檬水找零
总结:答案妙啊,利用根据身高从高到低排列后再根据Ki来改变位置就可以达到题目要求的序列顺序。因为已经根据身高排序了,所以每一个人的前面的人的身高必定都是大于等于当前人的身高的,接着再根据Ki的值来从前往后移动插入这个人的数据就行。总结:自己写了写,没有做到bug_free,没找到什么解决方法,和答案大体思路一致,在细节边界条件上没处理好。总结:挺容易的一道题。
2023-08-15 21:41:20
89
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅