- 博客(40)
- 收藏
- 关注
原创 图论Day6学习心得
所以,在代码实现的过程中,本质是要将 该节点作为出发点所连接的节点的 入度 减一 就可以了,这样好能根据入度找下一个节点,不用真在图里把这个节点删掉。拓扑排序在文件处理上也有应用,在做项目安装文件包的时候,经常发现复杂的文件依赖关系, A依赖B,B依赖C,B依赖D,C依赖E 等等。因为每次寻找入度为0的节点,不一定只有一个节点,可能很多节点入度都为0,所以要将这些入度为0的节点放到队列里,依次去处理。为了每次可以找到所有节点的入度信息,要在初始化的时候,就把每个节点的入度 和 每个节点的依赖关系做统计。
2025-08-20 18:50:56
748
原创 图论Day5学习心得
最后就生成了一个最小生成树,绿色的边将所有节点链接到一起,并且保证权值是最小的,因为我们在更新minDist数组的时候,都是选距离最小生成树最近的点加入到树中。最后,minDist数组也就是记录的是最小生成树所有边的权值。int v, e;// 填一个默认最大值,题目描述val最大为10000// 因为是双向图,所以两个方向都要填上// 所有节点到最小生成树的最小距离// 这个节点是否在树里// 我们只需要循环 n-1次,建立 n - 1条边,就可以把n个节点的图连在一起。
2025-08-18 21:41:18
977
原创 图论Day4学习心得
,这说明在两条边都可以删除的情况下,要删顺序靠后的边!来想一下 有向树的性质,如果是有向树的话,只有根节点入度为0,其他节点入度都为1(因为该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点)。所以情况一:如果找到入度为2的点,那么删一条指向该节点的边就行了。如图:找到了节点3 的入度为2,删 1 -> 3 或者 2 -> 3。选择删顺序靠后便可。但 入度为2 还有一种情况,情况二,只能删特定的一条边,如图:
2025-08-16 18:43:22
1971
原创 图论Day3学习心得
第二步:再遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。如果我们是处理当前访问的节点,当前访问的节点如果是 true ,说明是访问过的节点,那就终止本层递归,如果不是true,我们就把它赋值为true,因为这是我们处理本层递归的节点。当我们需要搜索一条可行路径的时候,就需要回溯操作了,因为没有回溯,就没法“调头”, 如果不理解的话,去看我写的。
2025-08-15 19:58:33
760
原创 图论Day2学习心得
注意题目中每座岛屿只能由相邻的陆地连接形成。也就是说斜角度链接是不算了。本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。这样计数器就是最终岛屿的数量。那么如何把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS。。如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。这样写就会很容易超时。因此需要加入的时候就进行标记。
2025-08-14 20:22:12
714
原创 单调栈学习心得
题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。
2025-08-03 16:19:10
682
原创 动态规划Day7学习心得
t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];dp数组如何初始化从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。这里大家已经可以发现,在定义dp[i][j]含义的时候为什么要。
2025-08-01 18:06:54
1061
原创 动态规划Day6学习心得
如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;
2025-07-31 20:59:48
775
原创 动态规划Day5学习心得
今天继续看动态规划的题目。这道题目实际上是一个关于二叉树的遍历过程加上动态规划的dp数组。对于树的话,首先就要想到遍历方式,前中后序(深度优先搜索)还是层序遍历(广度优先搜索)。。
2025-07-30 22:08:14
1129
原创 动态规划Day4学习心得
如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。和01背包还是如出一辙的。
2025-07-29 18:01:37
1005
原创 动态规划Day2学习心得
首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图:在看其他情况。状态转移方程。
2025-07-26 15:06:13
762
原创 动态规划Day1学习心得
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
2025-07-25 20:17:37
707
原创 贪心算法Day6学习心得
当然,还是要用贪心的思路来想一下。题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。这一点如果想清楚了,这道题就好办了。此时是从前向后遍历还是从后向前遍历呢?
2025-07-24 19:13:51
956
原创 贪心算法Day5学习心得
即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。题目要求同一字母最多出现在一个片段中,那么如何把同一个字母的都圈在同一个区间里呢?知道如何判断重复之后,剩下的就是合并了,如何去模拟合并区间呢?在遍历的过程中相当于是要找每一个字母的边界,
2025-07-23 18:59:58
394
原创 贪心算法Day4学习心得
但仔细思考一下就发现:如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。如果真实的模拟射气球的过程,应该射一个,气球数组就remove一个元素,这样最直观,毕竟气球被射了。此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。全局最优:完成全部账单的找零。
2025-07-22 16:02:01
392
原创 贪心算法Day3学习心得
如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。
2025-07-22 15:58:39
1977
原创 贪心算法Day2学习心得
那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1]).....(prices[1] - prices[0])。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!整体最优:一步尽可能多走,从而达到最少步数。
2025-07-21 17:25:08
892
原创 贪心算法Day1学习心得
贪心算法并没有固定的套路。从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。
2025-07-21 17:20:26
379
原创 回溯算法Day4学习心得
今天是回溯算法的最后一天:第一道题:491. 非递减子序列 - 力扣(LeetCode)这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。这又是子集,又是去重,但与昨天的90.子集II (opens new window)不太一样。在90.子集II (opens new window)中是通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。所以不能使用之前的去重逻辑!本题给出的示例,还是一个有序数组 [4, 6, 7
2025-07-19 20:20:44
616
原创 回溯算法Day3学习心得
这道题目相信大家刚看的时候,应该会一脸茫然。其实只要意识到这是切割问题,,和刚做过的就十分类似了。切割问题可以抽象为树型结构,如图:分割之后,加分隔符的操作只需要使用字符串的相关操作就可以了。其他的和昨天的分割回文子串是类似的。求子集问题和和又不一样了。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。
2025-07-18 19:00:20
814
原创 回溯算法Day2学习心得
在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。
2025-07-17 19:44:44
556
原创 回溯算法学习Day1
这道题也是经典的回溯算法题,只不过外面套了一层电话号码的壳,每多一个号码,就会多一次遍历。path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。这道题是上一道题的变体。回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度就构成了树的深度。回溯法也可以叫做回溯搜索法,它是一种搜索的方式。
2025-07-16 19:23:18
216
原创 二叉树学习心得
因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。因为数组大家都知道怎么遍历啊,从后向前,挨个累加就完事了,这换成了二叉搜索树,看起来就别扭了一些是不是。然而[1, 3]区间在二叉搜索树的中可不是单纯的节点3和左孩子节点0就决定的,还要考虑节点0的右子树。如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。
2025-07-15 14:51:46
704
原创 二叉树学习心得
上一次做的是二叉树的公共祖先,是通过从底向上的回溯算法来解决问题的,而对于二叉搜索树,由于其具有的性质,我们完全可以通过其中序遍历后的有序数组来进行查找。第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点。第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。今天依然是二叉树的学习做题。
2025-07-14 11:21:21
291
原创 二叉树学习心得
当然,这道题是有更简便的思路的,由于本题中二叉树是二叉搜索树,所以中序遍历后是一个有序数组,对于一个普通的二叉树,只有上面的思路是可以的,但是对于二叉搜索树,由于其性质,我们发现对于一个有序数组,我们只需要比较相邻的两个数,就可以把相同值的所有数都找到。最容易想到的思路肯定是对二叉搜索树进行一次遍历,并使用类似哈希表字典的方式记录每一个元素出现的次数,然后利用字典查找,将中枢找出来。在昨天的学习中,我们已经了解到将二叉搜索树使用中序遍历就是一个有序数组,而对于有序数组,我们去寻找最小绝对差显然是简单的。
2025-07-12 19:29:47
295
原创 二叉树学习心得
这一道需要将两个二叉树对应位置的数相加,作为新的二叉树对应位置的结果。其核心就是对原来的两个二叉树进行相同的遍历,从而对应位置相加,构建新的二叉树的节点。如果要验证二叉搜索树,就需要利用其特点,当使用中序遍历一个二叉搜索树时,其数组是有序的,因此我们可以先用中序遍历获得数组,再验证数组是否有序即可。这一道相当于不断寻找最大值,只不过加入了一个构建二叉树的步骤,思路类似于不断二分。上面的顺序是中序遍历,大家可以再试试其他的顺序都是一样的。今天是二叉树的一些题目,做一下来加深一下之前的学习内容。
2025-07-11 14:13:50
260
原创 KMP算法(建立在一定了解的基础上)
本篇适用于看了一些基本讲解视频,但是还是云里雾里的朋友,可能通过图灵机的角度去理解会更加的清晰。首先先来看一下KMP算法的应用场景,明确其能解决什么样的任务:28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)解释一下,其实就是在字符串中寻找一段已知字符串,并输出位置。最简单的思路是两层for循环进行暴力遍历,但是每一次已知字符串都需要遍历一遍,这样时间复杂度就变成了((n-m)*m)n,m分别是搜索对象和已知字符串的长度。但是我们现在需要降低时间复杂度,寻找更优的算法。有三个人发明了这个K
2025-07-10 21:21:50
1846
原创 Day9学习内容||队列.栈
这道题与上一题类似,不同的是,对于弹出的时机的机制,上一题是每遇到一次右括号就弹出一次进行比对,而这道题在每一次遇到新的字符时,都需要执行一次弹出并比对,当匹配成功时正好消除,但不成功时需要将这两个元素都放进去。分析栈和队列的形式,可以发现栈就像是封口的队列,因此我们需要两个栈来实现队列,一个作为元素的进入,另一个作为元素的出去。今天的学习内容是队列和栈,这两种容器适配器的功能比较像,队列是先进先出,栈是先进后出,二者可以互相实现,同时二者额都可以通过数组,或者链表来实现。
2025-07-04 22:37:19
175
原创 Day7学习心得||454,383,15,18
与之前的四数相加II不同的是,这一次的数能取到重复的元素,但不能出现重复的三元组或是四元组,题目比较复杂,笔者虽然最终看懂了,但还是写不出什么比较清晰的解释,就附上两个链接提供一下思路。注意一下,这道题目中并没有对于数的重复使用做限制,因此最简单的思路是使用4层for循环,当然也可以使用一些基础的if判定,做一些剪枝,但时间复杂度在大体上并没有什么可观的改善。这道题会比较适合用哈希表,通过快速查找,从而实现四数相加等于目标值的查找,从而使用两次双层for循环来降低时间复杂度。
2025-07-01 22:16:27
163
原创 Day6学习心得||Leetcode242,349,202,1(哈希表)
这道题需要注意的一点是,如果是快乐数,就必然会出现1的情况,这样就能很快的结束循环,然而对于不是快乐数的情况,根据数学推理发现必然会出现循环,因此只要注意是否在循环时出现了之前的数,就可以论证其是否是快乐数。需要把字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,一般哈希表都是用来快速判断一个元素是否出现集合里。OK,今天的分享就到这里。
2025-06-30 21:45:48
306
原创 Day5学习心得||2023OPPO提前批笔试题
这样思考,第一步是判断能否马或象一步到达,然后由象的走法可以发现,只要横坐标之差和纵坐标之差的奇偶性相同,就可以由原位置通过象走两步到达最终的位置,如果这样也不行的话,而如果是马走两步到达的位置,经过数学分析发现也可以由象走两步到达。很明显的是象的范围会很大,所以首先判断能否一次到象,然后笔者的思路就是通过bfs的思路来获得马一步到的位置,然后再去判断,相当于在整个bfs算法中将判断能否一步到象,然后是bfs的一般操作。仔细回想,这道题对于编程的代码可能考察不是很多,但是会考察路径规划的算法多一点。
2025-06-29 20:52:24
556
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅