算法沉淀
文章平均质量分 95
爱学习的鱼佬
C/C++领域新星创作者、C/C++方向新星计划Top5获得者、阿里云乘风者计划专家博主
展开
-
算法沉淀——贪心算法七(leetcode真题剖析)
首先题目要求保证存在答案,我们只需将出现次数最多的那个数两两相隔放置,剩下的数接着两两相隔放置即可,关于剩下的数为什么也可以直接两两放置,这是因为我们可以通过鸽巢定理推出只有出现最多的数才会影响到相隔,而我们解决了出现次数最大的数,所以剩下的数只要继续按照两两相隔的顺序继续放置即可。这一题和上一题思路基本一致,但需要注意的是,这一题并没有说一定有解,所以这里我们需要给出不符合的判断,其余代码类似上一题。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。原创 2024-03-21 23:10:01 · 3456 阅读 · 64 评论 -
算法沉淀——贪心算法六(leetcode真题剖析)
按照左端点排序,这样互相重叠的区间都是连续的,这样,我们在射箭的时候,要发挥每一支箭最大的作用,应该把互相重叠的区间统一引爆。因为我们是按左端点排序的,因此对于两个区间,我们求的是他们的交集,左端点为两个区间左端点的最大值,右端点为两个区间的右端点的最小值。首先我们按左端点排序,当两个区间重叠的时候,为了能保留更多的区间,我们应移除右端点较大的区间,代码的实现类似上一题。这里我们要使用贪心思想,首先需要对整体进行排序,通过不断比较更新数组右区间的值,得到最大长度的区间数组。可以射出的弓箭的数量。原创 2024-03-21 23:08:59 · 1155 阅读 · 29 评论 -
算法沉淀——贪心算法五(leetcode真题剖析)
为了方便处理数字,我们可以先将整数转换成字符串,然后从左往右扫描,找到第一个递减的位置,然后从这个位置往前推,推到相同数字的最前端,该位置-1,后面所有数都改成9,这样就得到最终结果。这里我们可以利用层序遍历的思想进行数组遍历,从第一步开始,计算每一步能跨出的范围内最大的那个数字的步数,这样我们就可以找到需要使用的最小的跳跃步数。枚举所有起点,模拟加油的流程,但在这里做一个优化,就是贪心思想,我们在枚举每一个点时,若该点不成功,就直接跳过中间所有点,这样我们可以做很大的优化。的最大数字,且数字呈。原创 2024-03-20 22:00:59 · 1704 阅读 · 27 评论 -
算法沉淀——贪心算法四(leetcode真题剖析)
首先我们想到如果某个字符出现偶数次,那么它一定可以构成回文串,所以我们利用这个思想将所有字符的偶数个都计入回文串的个数中,若该个数不超过给出的字符串长度,那么我们可以再加上任意字符,即为最长的回文字符串。我们可以通过例子发现,前两个位置的数无法被改变,在这道题中,为了让结果最大,我们应将第二个位置之后的数都变成分子,所以我们只需要将括号加在第二位至最后一位即可得出最大数。时,为了让上升的数有更多选择空间,我们可以选择当前可选择最小的那个数,反之,选择最大的数。,这是能让孩子们满足胃口的饼干的最小尺寸;原创 2024-03-20 21:59:56 · 1461 阅读 · 33 评论 -
算法沉淀——贪心算法三(leetcode真题剖析)
这道题目并不是一道贪心题,但是可以为下一道贪心题提供思路,这里我们额外建立一个下标数组,相对于身高对下标数组进行排序,最后映射名字输出即可。题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/当己方此时最差的比不过对面最差的时候,让我方最差的去处理掉对面最好的(反正要输,不如去拖掉对面⼀个最强的);当己方此时最差的能比得上对面最差的时候,就让两者比对下去(最差的都能获胜,为什么要输呢)。以这种方式修改数组后,返回数组。原创 2024-03-19 11:25:28 · 1325 阅读 · 26 评论 -
算法沉淀——贪心算法二(leetcode真题剖析)
当找到更低的价格时,更新这个变量;当计算当前位置的利润时,与之前记录的最大利润进行比较,如果更大则更新最大利润。这种方法的关键点在于,我们只关心递增子序列的最后一个元素,而不是整个递增子序列的具体形状。通过维护最后一个元素的最小值,可以在遍历数组时保持递增子序列的长度信息,并在需要时更新。上一题的精简版,可以直接用上面的代码返回长度是否大于等于三即可,但在这里我们不需要这么复杂,仅需连个变量即可。当找到以某个位置为起点的最长连续递增序列后,可以直接将下一个位置作为新的起点,继续寻找下一个最长连续递增序列。原创 2024-03-19 11:24:21 · 1581 阅读 · 35 评论 -
算法沉淀——贪心算法一(leetcode真题剖析)
贪心算法(Greedy Algorithm)是一种基于贪心策略的优化算法,它通常用于求解最优化问题,每一步都选择当前状态下的最优解,以期望通过局部最优的选择最终达到全局最优。贪心算法的思想是在每一步都做出在当前状态下局部最优的选择,而不考虑未来可能造成的影响。原创 2024-03-06 15:50:13 · 2681 阅读 · 50 评论 -
算法沉淀——动态规划之其它背包问题与卡特兰数(leetcode真题剖析)
题目链接:https://leetcode.cn/problems/unique-binary-search-trees/题目链接:https://leetcode.cn/problems/ones-and-zeroes/注意这里题目意思容易混淆概念,其实这里是一个排列问题而并非组合问题,所以应该是普通的动态规划问题。如果成员参与了其中一项工作,就不能参与另一项工作。名员工,他们可以完成各种各样的工作创造利润。返回满足题意的二叉搜索树的种数。的最大子集的长度,该子集中。个节点组成且节点值从。原创 2024-03-06 15:49:08 · 2297 阅读 · 51 评论 -
算法沉淀——动态规划之完全背包问题(leetcode真题剖析)
完全背包问题是背包问题的一种变体,与01背包问题不同,它允许你对每种物品进行多次选择。具体来说,给定一个固定容量的背包,一组物品,每个物品有重量和价值,目标是找到在背包容量范围内,使得背包中的物品总价值最大的组合。原创 2024-03-04 22:46:21 · 5517 阅读 · 77 评论 -
算法沉淀——动态规划之01背包问题(leetcode真题剖析)
01背包问题是一类经典的动态规划问题,通常描述为:有一个固定容量的背包,以及一组物品,每件物品都有重量和价值,目标是找到在背包容量范围内,使得背包中的物品总价值最大的组合。原创 2024-03-04 22:44:38 · 5282 阅读 · 28 评论 -
算法沉淀——动态规划之两个数组的 dp(下)(leetcode真题剖析)
题目链接:https://leetcode.cn/problems/minimum-ascii-delete-sum-for-two-strings/题目链接:https://leetcode.cn/problems/maximum-length-of-repeated-subarray/题目链接:https://leetcode.cn/problems/regular-expression-matching/由于前两种情况包含了第三种情况,因此只需考虑前两种情况下的最大值。的,而不是部分字符串。原创 2024-02-29 18:31:13 · 1070 阅读 · 20 评论 -
算法沉淀——动态规划之两个数组的 dp(上)(leetcode真题剖析)
如果我们希望确保两条直线不相交,我们可以将问题转化为在两个整数数组中寻找最长的公共子序列。这是因为,如果两条直线不相交,它们在同一列上对应的两个元素在两个数组中的顺序关系应该保持一致。是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。题目链接:https://leetcode.cn/problems/longest-common-subsequence/以这种方法绘制线条,并返回可以绘制的最大连线数。是这两个字符串所共同拥有的子序列。原创 2024-02-29 18:30:26 · 1267 阅读 · 0 评论 -
算法沉淀——动态规划之回文串问题(上)(leetcode真题剖析)
回文子序列和回文子串的分析方式一般都是选择这段区域的「左右端点」的字符情况来分析。因为如果一个序列是回文串的话,「去掉首尾两个元素之后依旧是回文串」,「首尾加上两个相同的元素之后也依旧是回文串」。其实这里我们可以依照第一题的解法将所有的子串都进行统计,再遍历计算每个分割位置组成的3个子串是否都符合回文子串即可。和上一题思路基本一致,但这里我们要返回字串,所以我们需要在原有算法上标记字串的开始位置和子串的长度。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。原创 2024-02-28 20:25:25 · 2445 阅读 · 56 评论 -
算法沉淀——动态规划之子序列问题(下)(leetcode真题剖析)
(回想一下,子序列是从原序列 arr 中派生出来的,它从 arr 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。的正整数数组形成序列 arr ,找到 arr 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0。是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从。数组中的子序列是从数组中删除一些元素(也可能不删除)得到的一个序列。中最长等差子序列的长度,该子序列中相邻元素之间的差等于。,并且任意两个相邻元素之差相同,则称该序列为等差序列。) 的值都相同,那么序列。原创 2024-02-28 20:23:39 · 1438 阅读 · 41 评论 -
算法沉淀——动态规划之子序列问题(上)(leetcode真题剖析)
这样的动态规划算法通过遍历数组,不断更新状态,最终得到以每个位置为结尾的子序列中最长递增子序列的长度。这样的动态规划算法通过遍历数组,不断更新状态,最终得到以每个位置为结尾的子序列中最长的摆动序列长度。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。给定一个未排序的整数数组 nums , 返回最长递增子序列的个数。个位置元素为结尾的所有「子序列」中,最长递增子序列的长度。原创 2024-02-27 21:53:48 · 1564 阅读 · 24 评论 -
算法沉淀——动态规划之子数组、子串系列(下)(leetcode真题剖析)
由于需要用到前两个位置的元素,但前两个位置的元素又无法构成等差数列,因此初始化。位置元素为结尾的所有子数组中,最后呈现「上升状态」下的最长湍流数组的长度,而。**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。位置元素为结尾的所有子数组中,最后呈现「下降状态」下的最长湍流数组的长度。,为了确定当前的字符串能否由字典中的单词构成,根据最后一个单词的起始位置。,这样就没有下标的映射关系的问题了,同时还能处理「空串」的情况。位置的布尔值,表示整个字符串能否被字典中的单词拼接而成。原创 2024-02-27 21:52:17 · 1381 阅读 · 25 评论 -
算法沉淀——动态规划之子数组、子串系列(上)(leetcode真题剖析)
定义两个状态数组 f[i] 和 g[i] 分别表示以 i 为结尾的所有子数组的最大乘积和最小乘积。,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。数组的子数组是从该数组中取出的零个或多个值的连续序列。,找到其中所有元素的乘积为正的子数组的最大长度。,说明当前子数组的乘积为正数,直接找到。,说明当前子数组的乘积为零,所以。,说明当前子数组的乘积为零,所以。原创 2024-02-26 23:13:07 · 1711 阅读 · 25 评论 -
算法沉淀——动态规划之简单多状态 dp 问题(下)(leetcode真题剖析)
这里和上一题最大的区别就是交易次数的限制,需要注意的是,k值可能超过数组长度的一半,所以我们需要注意k的取值,其余同上一题的原理。你可以无限次地完成交易,但是你每笔交易都需要付手续费。**注意:**这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。原创 2024-02-26 23:11:37 · 1569 阅读 · 29 评论 -
算法沉淀——动态规划之简单多状态 dp 问题(上)(leetcode真题剖析)
具体来说,可以创建一个大小为 10001(根据题目的数据范围)的 hash 数组,将 nums 数组中的每个元素 x 累加到 hash 数组下标为 x 的位置上。通过将每个数字的出现的和记录在 hash 数组中,然后在 hash 数组上应用「打家劫舍」的思路,你能够有效地解决这个问题。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。这个地方所有的房屋都。原创 2024-02-25 13:30:49 · 1658 阅读 · 19 评论 -
算法沉淀——动态规划之路径问题(leetcode真题剖析)
如果我们定义为“从起点开始,到达 [i, j] 位置的时候,所需的最低初始健康点数”,分析状态转移时可能会受到后续路径的影响。在状态转移方程中,我们考虑从 [i, j] 位置出发的两种选择: i. 向右走到终点,即从 [i, j] 到 [i, j + 1];在处理这种「路径类」的问题时,动态规划的状态表一般有两种常见形式:一是从某个位置出发,描述到达其他位置的情况;在初始化阶段,我们在最前面加上一个“辅助结点”来帮助初始化,需要注意辅助结点里面的值要保证后续填表是正确的,以及下标的映射关系。原创 2024-02-25 13:29:31 · 2288 阅读 · 4 评论 -
算法沉淀——动态规划之斐波那契数列模型(leetcode真题剖析)
动态规划(Dynamic Programming,简称DP)是一种通过将原问题分解为相互重叠的子问题并仅仅解决每个子问题一次,将其解存储起来,避免重复计算,从而提高效率的算法优化技术。它通常用于求解最优化问题。原创 2024-02-24 15:06:02 · 1585 阅读 · 8 评论 -
算法沉淀——记忆化搜索(leetcode真题剖析)
记忆化搜索算法(Memoization)是一种通过存储已经计算过的结果来避免重复计算的优化技术,通常应用于递归算法中。这种技术旨在提高算法的效率,减少重复计算,特别是对于具有重叠子问题的问题。原创 2024-02-24 15:04:11 · 1776 阅读 · 0 评论 -
算法沉淀——FloodFill 算法(leetcode真题剖析)
Flood Fill(泛洪填充)算法是一种图像处理的基本算法,用于填充连通区域。该算法通常从一个种子点开始,沿着种子点的相邻像素进行填充,直到遇到边界或者其他指定的条件为止。Flood Fill 算法的主要应用是在图像编辑软件中实现填充操作,以及在计算机图形学、计算机视觉等领域中进行区域填充。原创 2024-02-23 23:32:57 · 2012 阅读 · 8 评论 -
算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四(leetcode真题剖析)
通过深度优先搜索的方式,不断地枚举相邻元素作为下一个字母出现的可能性,并在递归结束时回溯,直到枚举完所有可能性,得到正确的结果。这里和上面的回溯不太一样的地方在于我们必须通过所有的0标记位置,首先我们要计算出所有0的个数,再加上1个2的位置就是我们要走的路的长度,依照要走的长度和起始位置找到不同的路线,这里可以使用深度优先遍历找到不同的路径。为了存储每个位置的元素,我们需要定义一个二维数组。特别地,在本题中,我们需要直接修改给出的数组,因此在找到一种可行的方法时,应该停止递归,以防止正确的方法被覆盖。原创 2024-02-23 23:30:44 · 1089 阅读 · 0 评论 -
算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习三(leetcode真题剖析)
在检查皇后是否冲突时,可以使用一个数组来记录每一列是否已经放置了皇后,并检查当前要放置的皇后是否会和已经放置的皇后冲突。对于对角线,可以使用两个数组来记录从左上角到右下角的每一条对角线上是否已经放置了皇后,以及从右上角到左下角的每一条对角线上是否已经放置了皇后。通过深度优先搜索的方式,不断地枚举每个数在当前位置的可能性,并回溯到上一个状态,直到枚举完所有可能性,得到正确的结果。首先,在每一行放置第一个皇后,然后遍历棋盘的第二行,在可行的位置放置第二个皇后,再遍历第三行,以此类推,直到放置了n个皇后为止。原创 2024-02-22 15:40:02 · 1397 阅读 · 15 评论 -
算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习二(leetcode真题剖析)
为了提高时间复杂度,可以事先计算数组中所有数字的和 以及数组的长度。这道题目要求从1到n中选择k个数的所有组合,其中不考虑顺序,即[1,2]和[2,1]等价。这样的判断方式确保了在递归的过程中,左括号数量始终大于等于右括号数量,并且左括号的总数量与右括号的总数量相等,保证生成的括号序列是合法的。因此,在选择当前元素并向下传递下标时,应该直接传递当前元素的下标。这样的流程能够确保生成所有的组合,并且通过限制选择元素的大小顺序,避免了重复计算。代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且。原创 2024-02-22 15:37:25 · 1274 阅读 · 0 评论 -
算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习一(leetcode真题剖析)
这里要考虑全排列,在同一节点的所有组合中,相同的元素只能选择一次,所以这里我们要有一个标记元素是否使用的数组,在后面的主逻辑递归中,有两种写法,第一种是只关心“不合法”分支,第二种是只关心“合法”分支。通过深度优先搜索的方式,不断枚举每个数在当前位置的可能性,然后回溯到上一个状态,直到枚举完所有可能性得到正确的结果。这一题实际上还是和上一题类似的子集问题,只不过我们将存下的数组变为了一个值,进数组变为子集累计异或的值,出临时数组变为异或相同值,也就是删除异或过的数。的字符串,返回所有它能表示的字母组合。原创 2024-02-21 11:51:23 · 2003 阅读 · 35 评论 -
算法沉淀——二叉树中的深搜(leetcode真题剖析)
二叉树的深度优先搜索是一种遍历二叉树的方法,它通过深度递归的方式探索树的结构。有两种主要形式:前序遍历、中序遍历、和后序遍历。在二叉树上执行深度优先搜索,意味着首先探索到树的深度,然后回溯到更浅的层次。原创 2024-02-21 11:49:34 · 1184 阅读 · 13 评论 -
算法沉淀——递归(leetcode真题剖析)
递归是一种通过调用自身的方式来解决问题的算法。在递归算法中,问题被分解为更小的相似子问题,然后通过对这些子问题的解进行组合来解决原始问题。递归算法通常包含两个主要部分:1. **基本情况(Base Case):** 定义问题的最小规模,直接解答而不再进行递归。基本情况是递归算法的出口,防止算法陷入无限递归。2. **递归步骤:** 在问题规模较大时,将问题划分为相似但规模较小的子问题,并通过递归调用解决这些子问题。递归调用自身是递归算法的核心。原创 2024-02-20 10:47:26 · 1345 阅读 · 29 评论 -
算法沉淀——BFS 解决拓扑排序(leetcode真题剖析)
Breadth-First Search (BFS) 在拓扑排序中的应用主要是用来解决有向无环图(DAG)的拓扑排序问题。拓扑排序是对有向图中所有节点的一种线性排序,使得对于每一条有向边 (u, v),节点 u 在排序中都出现在节点 v 的前面。如果图中存在环路,则无法进行拓扑排序。原创 2024-02-20 10:45:28 · 1454 阅读 · 18 评论 -
算法沉淀——多源 BFS(leetcode真题剖析)
多源 `BFS` 是指从多个源点同时进行广度优先搜索的算法。在传统的 `BFS` 中,我们通常从一个起始点开始,逐层遍历所有的相邻节点。而在多源 `BFS` 中,我们可以同时从多个源点开始,从这些源点出发,逐层向外扩展,直到达到目标或者遍历完整个图。原创 2024-02-19 12:04:11 · 1970 阅读 · 50 评论 -
算法沉淀——BFS 解决最短路问题(leetcode真题剖析)
`BFS`(广度优先搜索)是解决最短路径问题的一种常见算法。在这种情况下,我们通常使用BFS来查找从一个起始点到目标点的最短路径。原创 2024-02-19 11:59:07 · 2487 阅读 · 33 评论 -
算法沉淀——BFS 解决 FloodFill 算法(leetcode真题剖析)
BFS(广度优先搜索)解决 Flood Fill 算法的基本思想是通过从起始点开始,逐层向外扩展,访问所有与起始点相连且具有相同特性(颜色等)的区域。在 Flood Fill 中,通常是通过修改图像的像素颜色。原创 2024-02-16 16:26:49 · 1755 阅读 · 45 评论 -
算法沉淀——优先级队列(堆)(leetcode真题剖析)
优先队列(Priority Queue)是一种抽象数据类型,它类似于队列(Queue),但是每个元素都有一个关联的优先级。在优先队列中,元素按照优先级从高到低(或从低到高)排列,高优先级的元素先出队。这种数据结构可以用堆(Heap)来实现。原创 2024-02-16 16:24:02 · 1318 阅读 · 6 评论 -
算法沉淀——队列+宽度优先搜索(BFS)(leetcode真题剖析)
队列 + 宽度优先搜索算法(Queue + BFS)是一种常用于图的遍历的算法,特别适用于求解最短路径或最少步数等问题。该算法通常用于在图中寻找从起点到目标点的最短路径。原创 2024-02-15 15:05:41 · 2456 阅读 · 61 评论 -
算法沉淀——栈(leetcode真题剖析)
栈(Stack)是一种基于先进后出(Last In, First Out,LIFO)原则的数据结构。栈具有两个主要的操作:1. **压栈(Push)**:将元素添加到栈的顶部。2. **出栈(Pop)**:从栈的顶部移除元素。栈常常用于需要反转操作顺序的场景,或者在需要记录操作历史的情况下。原创 2024-02-15 15:00:02 · 1343 阅读 · 26 评论 -
算法沉淀——字符串(leetcode真题剖析)
这里我们可以两两比较,也可以同时比较,这里我使用的是同时比较相同下标的字母,遇到不同或者其中一个字符串越界直接返回即可,若循环结束没有返回,则说明只有一个字符串,返回第一个字符串即可。但为了我们书写代码的方便性,我们选择一种优化版本,在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去考虑进位。其实和之前链表中的两数之和的原理是一样的,只不过那个是十进制,而这里是二进制,我们累加进位拼接字符串,计算完之后,不要忘了我们是逆序相加的,所以最后还需要翻转字符串。如果不存在公共前缀,返回空字符串。原创 2024-02-14 17:07:29 · 1406 阅读 · 49 评论 -
算法沉淀——哈希算法(leetcode真题剖析)
哈希算法(Hash Algorithm)是一种将任意长度的输入(也称为消息)映射为固定长度的输出的算法。这个输出通常称为哈希值或摘要。哈希算法的主要目的是快速、高效地检索数据,因为哈希值可以用作数据的唯一标识。原创 2024-02-14 17:06:03 · 2867 阅读 · 26 评论 -
算法沉淀——链表(leetcode真题剖析)
1、画图->直观形象、便于理解2、引入虚拟"头节点"3、要学会定义辅助节点(比如双向链表的节点插入)4、快慢双指针(判断链表是否有环、找到环的入口、找链表中倒数第n个节点等)原创 2024-02-13 12:33:45 · 1411 阅读 · 44 评论 -
算法沉淀——分治算法(leetcode真题剖析)
分治算法是一种解决问题的算法范式,其核心思想是将一个大问题分解成若干个小问题,递归地解决这些小问题,最后将它们的解合并起来得到原问题的解。分治算法的一般步骤包括分解(Divide)、解决(Conquer)、合并(Combine)。原创 2024-02-13 12:32:34 · 2056 阅读 · 28 评论