算法
文章平均质量分 60
算法
烧冻鸡翅QAQ
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
KMP算法
没错,是这样的,但是这样的代码效率是很低的,假设haystack字符串长度是n,needle字符串长度是m,那常规解法的时间复杂度就是O(m×n),科学家之所以提出KMP算法,就是想要优化这个查找的过程,在经过科学家的优化之后,使用KMP算法解决字符串查找问题,其时间复杂度可以降为O(m+n),直接乘法变加法,同志们这太猛了啊,还得是科学家。我也是这么想的,可能作者一开始也是按照我们的思路去写的,只不过后面他发现,可以用Next数组简化求公共前后缀的步骤,于是他从这个角度出发,最终写成了上面的代码。原创 2025-11-18 19:25:39 · 322 阅读 · 0 评论 -
376.摆动序列
f[i] 表示:以 i 位置元素为结尾的所有的子序列中,最后一个位置呈现 “上升” 趋势的最长摆动序列的长度。g[i] 表示:以 i 位置元素为结尾的所有的子序列中,最后一个位置呈现 “下降” 趋势的最长摆动序列的长度。根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。dp[i] 表示:以 i 位置元素为结尾的所有的子序列中,最长的摆动序列的长度。原创 2025-09-27 06:21:23 · 905 阅读 · 0 评论 -
最长递增子序列
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。dp[i]的含义是以nums[i]为结尾的最长递增子序列的长度。原创 2025-09-26 16:14:58 · 277 阅读 · 0 评论 -
环绕字符串中唯一的子字符串
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。记f[i]为字符串s中以s[i]为结尾的在base中出现的最长子字符串长度。原创 2025-09-26 15:46:59 · 314 阅读 · 0 评论 -
139.单词拆分
对于每个位置 i,从 0 到 i - 1 遍历,如果 dp[j] 为 true 且子字符串 s.substr(j, i - j) 存在于字典中,那么 dp[i] = true。根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。f[i+1]表示s[0]~s[i]这个子串能否被字典中的单词拼出。原创 2025-09-26 07:35:55 · 152 阅读 · 0 评论 -
最长湍流子数组
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。f[i]的含义是以nums[i]为终点的最大湍流子数组长度。原创 2025-09-26 06:58:31 · 164 阅读 · 0 评论 -
等差数列划分
由于这俩就差二,所以我们只要改变一下f[i]的起点就能实现意义的转换(理解的时候可以按照长度去理解)根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。f[i]-2表示的是以nums[i]为终点的等差子数组的个数。f[i]表示以nums[i]为终点的最长等差子数组的长度。原创 2025-09-26 06:26:10 · 340 阅读 · 0 评论 -
乘积为正数的最长子数组长度
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。f[i]的含义是乘积为正数的以nums[i-1]为终点的最长子数组长度。g[i]的含义是乘积为负数的以nums[i-1]为终点的最长子数组长度。原创 2025-09-26 06:02:59 · 331 阅读 · 0 评论 -
乘积最大子数组
由于数组中可能存在负数,负数乘以负数会得到正数,因此需要同时维护当前最大值和当前最小值(因为最小值乘以负数可能变成最大值)。根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。位置为结尾的所有子数组中最大乘积。位置为结尾的所有子数组中最小乘积。原创 2025-09-26 05:27:41 · 314 阅读 · 0 评论 -
粉刷房子(简单多状态dp问题)
这个题只要你搞清楚dp[i][j]的含义,后面的状态转移方程也很好求,然后代码也很好写。原创 2025-08-18 18:04:54 · 321 阅读 · 0 评论 -
打家劫舍II
这个题和打家劫舍一的最大区别就在于,他的数组是一个环形数组,首尾是相连的,因此如果我们不允许小偷去偷两个相邻的房屋,那么第一个和最后一个房屋,也是不能同时偷的!因此这个题的解题关键就在于对第一个房子偷不偷进行分类讨论。原创 2025-08-18 16:26:35 · 385 阅读 · 0 评论 -
按摩师(简单多状态dp问题)
dp[i] 表示:从序列的最开始选择到 i 位置的时候,此时的最长预约时长(dp[0~i]这一子序列的最长预约时长)本题我们的填表顺序是从左往右两个表一起填。最后返回的是f(n)和g(n)中的最大值。必选,此时子序列的最长预约时长。不选,此时子序列的最长预约时长。原创 2025-08-18 15:24:48 · 247 阅读 · 0 评论 -
删除并获得点数
本题的解题思路就是将我们原问题中的数据进行重新整理,统计到一个用数组实现的哈希表中,哈希表中记录原数组中出现的每一个元素的个数。然后我们再对这个数组用打家劫舍模型处理即可。根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。根据已知条件:dp[0]=0,dp[1]=1,dp[2]=1。原创 2025-08-18 17:27:28 · 332 阅读 · 0 评论 -
买卖股票的最佳时机III和IV
那么实际上g[1][1]就是f[0][0]+prices[1],但我在算g[1][1]的时候,按照我们的递推公式,g[1][1]=max(g[0][1],f[0][0]+prices[1]),假如说f[0][0]+prices[1]最后算出来小于0,而你定义g[0][1]等于0,你这一比,g[1][1]不就不等于f[0][0]+prices[1],而等于0了吗,这就不对了!那你就忽略了一个条件,那就是f[0][0]代表的含义就是买入状态下,也就是手里持有一只股票的状态下能获得的最大利润。原创 2025-08-20 17:31:20 · 774 阅读 · 0 评论 -
63.不同路径
当然在实现的时候我们可以对它进行一个优化。是遇到有障碍物的位置,我们就对它不做处理,即到达这个位置的路径为零。根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。位置附近有没有障碍物,dp[i][j]都可以根据下面的递推公式来计算。dp[i][j]表示的是从最左上角移动到。这个题目我们要考虑障碍物,因此下面就。根据已知条件:dp[1][1]=1。位置附近有没有障碍物做分类讨论。原创 2025-08-17 19:21:30 · 219 阅读 · 0 评论 -
买卖股票的最佳时机(含手续费)
注意这个题里面买卖股票就没有冷冻期了,也就是说你头天刚刚卖出股票,第二天就能买入股,不需要再经历冷冻期但是这个题格外讲的一个条件就是你每买入和买出一次股票。就需要付一次手续费,让你考虑在这种情况下所能获得的最大利润。原创 2025-08-20 15:36:29 · 253 阅读 · 0 评论 -
下降路径最小和
时,我们最右边和最左边的dp数组就不要再加进来比了,容易造成越界访问,即使没有越界访问,因为比的是最小值,最外围的dp数组元素都是0,一比就把有效数据消除了。根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。dp[i][j]表示的是从第一层中的任意位置下降到。但是在实际实现的时候是要注意边界情况,即。位置处的下降路径最小和。原创 2025-08-17 20:21:20 · 230 阅读 · 0 评论 -
买卖股票的最佳时机含冷冻期
由于买入状态你手里是有票的,可交易的状态,你手里是没票的。在进行动态规划之前我们还要确定:dp[1][0],dp[1][1]和dp[1][2]的值,在股票开盘之前,我们手里并没有股票,因此第一天我们只能够进行买入的操作,如果进行买入,那么第一天结束的时候我们就处于买入的状态。也有可能是之前买然后保留下来的,如果是今天刚买的,那么今天的最大利润就是dp[i-1][1]-price[i],如果不是今天买的,那么今天的最大利润就是dp[i-1][0],综合考虑两种情况,我们要求最大值,所以。这个感觉没啥好说的。原创 2025-08-18 19:41:47 · 796 阅读 · 0 评论 -
地下城游戏(回头看)
请你看上面示例一中的标准答案那条路线,以及下下右右这条路线。非常显然,当骑士走到最后的时候,第二条路线的剩余体力是最多的。但是实际上第一条路线和第二条路线对于骑士来说是等价的,因为在这两条路线行走的过程中,骑士的体力相对于他进迷宫之前最多下降7点体力,因此我们要求的并不是骑士走完这条路线的体力剩余,而是骑士在这条路线中体力最多降低多少。原创 2025-08-18 01:10:18 · 398 阅读 · 0 评论 -
礼物的最大价值
dp[i][j]表示的是从左上角走到(i,j)这个位置所能获得的最大财富。原创 2025-08-17 19:43:04 · 218 阅读 · 0 评论 -
最小路径和
但是要注意边界条件,因为边界值初始化为0,我们比的又是最小值,所以当i和j位于矩阵数值边界时,不能把最外围那层0加进来比,否则会污染有效数据。根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。dp[i][j]表示的是矩阵从左上角走到(i,j)位置一路上的数字总和的最小值。本题的状态转移方程依然是。原创 2025-08-17 23:07:05 · 203 阅读 · 0 评论 -
初识贪心算法
比如对于我们的找零问题,假如你要找对面46块钱,你手里只有1块、5块、10块、20、50面额的纸币,你肯定是会先从这些纸币中拿一张面额最大的找给对面,因为面额最大就意味着纸币的张数最少。对于下面这个问题来说,他最优方案就是选两个体积为四的物品二,这种方案是最优的,就是价值最大的,但是如果我们采用上面三种策略,算出的答案都是错的。就是每道数学证明题它都有非常严格的、完整的证明,但是这个证明你一开始就非常难想到,你要做的事情就是去拜读这些数学大家做出的典范解法,感悟其中的精髓,然后写出你自己的解法。原创 2025-08-15 03:41:56 · 987 阅读 · 0 评论 -
三步问题(状态方程与泰波那契数是一样的)
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。本题的状态转移方程是:dp[i]=dp[i-1]+dp[i-2]+dp[i-3]根据已知条件:dp[0]=1,dp[1]=1,dp[2]=2,dp[3]=4。dp[n]表示的是n阶台阶的楼梯的上楼方式总数。原创 2025-08-17 14:50:41 · 159 阅读 · 0 评论 -
使用最小花费爬楼梯
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。dp[i]表示的是走到第i层时最少需要花多少钱。根据已知条件:dp[0]=0,dp[1]=0。原创 2025-08-17 15:39:46 · 267 阅读 · 0 评论 -
62.不同路径
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。这个题貌似我做过,二维dp问题的入坑题目,不多解释,直接上代码。表示的是从左上角走到这个位置的路径条数。原创 2025-08-17 18:56:18 · 273 阅读 · 0 评论 -
91.解码方法
我们在学习Huffman编码时都知道,编码过程中出现的前缀覆盖问题会导致编码出现歧义,所以我们通过构建哈夫曼树的方法来求出最短且没有歧义的前缀编码。那么这个题目就是给你一个存在前缀覆盖问题的编码方案,让你求出指定消息的所有解码方案到这里问题其实我们已经明白的差不多了,但是他怎么能和动态规划沾上边儿呢?原创 2025-08-17 18:39:38 · 433 阅读 · 0 评论 -
第N个泰波那契数
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果。本题的状态转移方程是:dp[i]=dp[i-1]+dp[i-2]+dp[i-3]dp[i]表示的是第i个泰波那契数的值。原创 2025-08-17 14:17:32 · 181 阅读 · 0 评论
分享