- 博客(131)
- 收藏
- 关注
原创 LeetCode算法日记 - Day 108: 01背包
本文介绍了01背包问题的两种变体解法。第一种允许背包不装满,只需在容量限制下最大化价值;第二种要求恰好装满背包,若无解则返回0。通过动态规划优化,将时间复杂度从暴力枚举的O(2^n)降至O(nV)。关键区别在于初始化:不装满时所有容量初始为0,恰好装满时除dp[0][0]外初始为-1表示无效状态。方案2转移时需检查上一状态是否有效。代码实现中需注意数组初始化和状态转移条件,避免从无效状态转移。该解法高效解决了大规模背包问题,适用于物品数量达1000的情况。
2025-11-20 20:18:06
1171
原创 LeetCode算法日记 - Day 107: 最长重复子数组
文章摘要:本文介绍了求解两个数组最长公共子数组的动态规划解法。题目要求找出nums1和nums2中最长的连续公共子数组长度。暴力解法时间复杂度太高,采用动态规划方法:定义dp[i][j]表示以nums1[i-1]和nums2[j-1]结尾的最长公共子数组长度,状态转移方程为当元素相等时dp[i][j]=dp[i-1][j-1]+1,否则为0。该方法时间复杂度O(nm),空间复杂度O(nm)。文中给出了完整Java实现代码,并分析了易错点和复杂度。
2025-11-20 20:17:45
1180
原创 LeetCode算法日记 - Day 106: 两个字符串的最小ASCII删除和
本文探讨了求解两个字符串最小ASCII删除和的问题。题目要求通过删除字符使两个字符串相等,且删除字符的ASCII值之和最小。解法采用动态规划,先计算两个字符串所有字符的ASCII总和,再通过DP表求得最大公共子序列的ASCII和。最终答案为总和减去两倍的最大公共子序列和。算法时间复杂度为O(nm),空间复杂度为O(nm),适用于长度不超过1000的字符串。关键点在于正确处理DP状态转移和下标偏移,确保计算准确高效。
2025-11-17 19:10:50
906
原创 LeetCode算法日记 - Day 105: 交错字符串
摘要:本文介绍了LeetCode上"交错字符串"问题的动态规划解法。给定字符串s1、s2和s3,判断s3是否由s1和s2交错组成。首先排除长度不匹配情况,然后构建二维DP表,其中dp[i][j]表示s1前i个字符和s2前j个字符能否组成s3前i+j个字符。通过初始化边界条件和填充DP表(考虑从s1或s2取字符的两种情况),最终返回dp[n][m]。该方法时间复杂度O(n×m),空间复杂度O(n×m),避免了递归回溯的超时问题,是解决此类字符串匹配问题的有效方案。
2025-11-17 19:10:43
599
原创 LeetCode算法日记 - Day 104: 通配符匹配
摘要:本文介绍了通配符匹配问题的动态规划解法。题目要求判断模式字符串p(含'?'和''通配符)是否能完全匹配输入字符串s。'?'匹配任意单个字符,''匹配任意字符序列(包括空序列)。通过构建二维DP表,其中dp[i][j]表示s前i个字符与p前j个字符的匹配情况。算法初始化边界条件后,按普通字符、'?'和'*'三种情况分别处理状态转移,最终返回dp[n][m]作为结果。该方法将指数级递归优化为O(n×m)多项式时间复杂度,适用于大规模数据。
2025-11-15 20:12:41
1131
1
原创 LeetCode算法日记 - Day 103: 不同的子序列
本文探讨了求解字符串子序列匹配计数问题的动态规划解法。给定字符串s和t,题目要求统计s的子序列中t出现的次数。常规递归解法时间复杂度高,采用二维动态规划优化:定义dp[i][j]表示s前i个字符组成t前j个字符的方案数。通过状态转移方程和边界条件填充DP表,将指数级复杂度优化为O(n×m)。最终返回dp[n][m]即为答案,确保算法在合理时间内处理大规模输入。
2025-11-15 20:12:21
682
原创 LeetCode算法日记 - Day 102: 不相交的线
本文探讨了如何求解两个数组间不相交连线的最大数量问题。该问题本质上是求最长公共子序列(LCS),可采用动态规划高效解决。文章详细解析了题目要求,指出回溯法虽直观但效率低下,转而采用动态规划,定义dp[i][j]表示前i和j个元素的最大连线数。通过状态转移方程(相等时dp[i-1][j-1]+1,不等时取max(dp[i-1][j],dp[i][j-1]))填充DP表,最终返回dp[n][m]。代码实现简洁明了,时间复杂度O(mn),空间复杂度O(mn)。
2025-11-13 19:41:59
1054
原创 LeetCode算法日记 - Day 101: 最长公共子序列
题目:最长公共子序列(LCS)问题 摘要:给定两个字符串text1和text2,求它们的最长公共子序列长度。子序列指在不改变字符顺序情况下删除某些字符后得到的新字符串。采用动态规划解法,定义dp[i][j]为text1前i个字符和text2前j个字符的LCS长度。当字符相同时,dp[i][j] = dp[i-1][j-1]+1;否则取dp[i-1][j]和dp[i][j-1]的最大值。初始化(n+1)×(m+1)的dp数组,最终返回dp[n][m]。时间复杂度O(nm),空间复杂度O(nm)。示例表明该解法
2025-11-13 19:41:14
538
原创 LeetCode算法日记 - Day 100: 让字符串成为回文串的最少插入次数
摘要 题目要求通过插入字符使字符串成为回文串的最少操作次数。采用动态规划解法,定义 dp[i][j] 表示子串 s[i...j] 的最小插入次数。若两端字符相等,则继承中间子串结果;否则在左或右插入一个字符,取较小操作值。代码通过双层循环填充DP表,时间复杂度为O(n²),空间复杂度O(n²)。示例显示解法正确性,如输入"mbadm"需2次插入。
2025-11-11 12:50:35
1155
原创 LeetCode算法日记 - Day 99: 最长回文子序列
题目:最长回文子序列 摘要:本文探讨了寻找字符串中最长回文子序列的动态规划解法。首先分析了暴力枚举法(时间复杂度O(2^n×n))的不可行性,进而提出使用区间DP。定义dp[i][j]表示子串s[i..j]的最长回文长度,状态转移分两种情况:当首尾字符相同时,dp[i][j]=dp[i+1][j-1]+2;不同时取去掉首或尾的较大值。实现时需注意从后往前遍历i,从i往后遍历j,确保子问题已计算。最终解为dp[0][n-1],时间复杂度O(n²),空间复杂度O(n²)。
2025-11-11 12:50:21
859
原创 LeetCode算法日记 - Day 98: 分割回文串 II
题目要求将字符串分割为若干回文子串,并找到最少分割次数。解法采用动态规划+预处理:首先用区间DP预处理所有子串的回文性质vis[i][j],记录s[i..j]是否为回文;然后进行动态规划计算,dp[i]表示s[0..i]的最少分割次数,若vis[0][i]为真则dp[i]=0,否则枚举分割点j,利用预处理结果优化。算法时间复杂度O(n²),空间复杂度O(n²)。
2025-11-09 12:23:48
1285
原创 LeetCode算法日记 - Day 97: 回文串分割 IV
摘要:本文介绍了一种判断字符串能否分割为三个非空回文子串的动态规划解法。首先通过预处理计算所有子串的回文性质(O(n²)时间),存储于二维数组dp中。然后枚举两种分割点组合(i,j),利用预计算结果在O(1)时间内验证三段子串的回文性。该方法将暴力解法的O(n³)复杂度优化至O(n²),适用于长度≤2000的字符串。关键点包括正确的预处理逻辑和分割点范围控制,避免空子串和数组越界问题。
2025-11-09 12:23:36
926
原创 LeetCode算法日记 - Day 96: 最长回文子串
本文介绍寻找字符串中最长回文子串的动态规划解法。题目要求在给定字符串中找出最长的回文子串,暴力枚举时间复杂度为O(n³)容易超时。动态规划解法利用回文子串的递推性质:若s[i]==s[j]且s[i+1..j-1]是回文,则s[i..j]也是回文。通过定义dp[i][j]表示s[i..j]是否为回文子串,采用i倒序、j正序的方式填表,过程中记录最长回文子串的起始位置和长度。该方法将时间复杂度优化至O(n²),空间复杂度为O(n²),显著提高了算法效率。
2025-11-07 17:12:00
1207
原创 LeetCode算法日记 - Day 95: 回文子串
摘要:本文介绍了统计字符串中回文子串数量的动态规划解法。通过定义dp[i][j]表示子串s[i..j]是否为回文,利用状态转移方程(核心是判断首尾字符相等且内部子串为回文)来优化暴力解法。关键点包括正确的遍历顺序(i倒序)、边界处理(单字符和相邻字符)以及只统计上三角矩阵的有效值。该方法将时间复杂度从O(n³)优化到O(n²),空间复杂度为O(n²),适用于长字符串的高效计算。
2025-11-07 17:11:40
742
原创 LeetCode算法日记 - Day 94: 最长的斐波那契子序列的长度
摘要:本文讨论了如何在一个严格递增的正整数数组中寻找最长斐波那契子序列的问题。斐波那契子序列需满足每个元素等于前两个元素之和。文章首先分析常规解法的时间复杂度问题,进而提出使用动态规划结合哈希表的优化方案。该方案通过定义dp[i][j]表示以arr[i]和arr[j]结尾的序列长度,利用哈希表快速查找前驱元素,实现O(n²)时间复杂度的解决方案。最后提供Java代码实现,并分析其时间空间复杂度。该解法有效避免了重复计算,能高效求出最长子序列长度。
2025-11-05 20:41:51
835
原创 LeetCode算法日记 - Day 93: 最长递增子序列的个数
摘要:本文介绍了求解最长递增子序列个数的动态规划解法。给定一个无序数组,需要统计严格递增的最长子序列的数量。通过构建两个数组:dp记录以每个元素结尾的最长子序列长度,count记录对应长度的路径数。采用双重循环遍历数组,当发现更优解时更新dp和count,否则累加相同长度的路径。最终统计所有满足最大长度的路径数之和。该算法时间复杂度O(n²),空间复杂度O(n),有效解决了回溯法重复计算的问题。关键点在于正确处理count数组的更新逻辑和最终结果的累加方式。
2025-11-05 20:41:16
887
原创 LeetCode算法日记 - Day 92: 摆动序列
本文解析了LeetCode上的摆动序列问题,要求找出数组中相邻元素差值正负交替的最长子序列长度。通过分析题目本质和约束条件,提出动态规划解法:使用两个状态数组f和g分别记录以正差和负差结尾的最长序列长度。算法思路包括初始化、状态转移(正差接负差序列,负差接正差序列)和最终结果查找。文章给出了Java实现代码,并分析了时间复杂度为O(n²)和常见易错点,如状态定义、转移条件和初始化等。该解法有效避免了暴力枚举的超时问题。
2025-11-03 21:04:32
953
原创 LeetCode算法日记 - Day 91: 最长数对链
摘要:本文讨论了最长数对链问题,即在给定数对数组中找出满足"b<c"条件的最长链。通过分析题目特性,提出动态规划解法:1)按右端点排序;2)定义dp数组记录以每个数对结尾的最长链长度;3)通过双重循环进行状态转移。该方法时间复杂度为O(n²),空间复杂度O(n)。文章还指出排序依据和连接条件的细节要求,并提供了完整的Java代码实现。
2025-11-03 21:04:26
929
原创 LeetCode算法日记 - Day 90: 最长定差子序列
本文探讨了寻找数组中满足固定差值的最长等差子序列问题。通过分析常规动态规划解法O(n²)的不足,提出利用HashMap优化查找过程的方法。关键思路是将数值作为键存储其对应的最长子序列长度,通过查找num-difference快速获取前驱状态。算法实现中,使用HashMap记录每个数值的最新状态,遍历数组时更新当前数值长度并维护全局最大值。该方法将时间复杂度优化至O(n),空间复杂度为O(n),有效解决了大规模数据下的性能问题。
2025-11-01 23:04:59
957
原创 LeetCode算法日记 - Day 89: 最长递增子序列
本文介绍了求解最长递增子序列(LIS)问题的动态规划解法。给定一个整数数组,要求找到最长严格递增子序列的长度。常规暴力解法时间复杂度高达O(2^n),不可行。动态规划方法定义dp[i]为以nums[i]结尾的LIS长度,通过双重循环遍历数组:外层遍历每个元素i,内层遍历i之前所有元素j,若nums[i]>nums[j],则更新dp[i]=max(dp[i],dp[j]+1)。初始时所有dp[i]=1,最终结果为dp数组的最大值。该方法将时间复杂度优化到O(n^2),空间复杂度为O(n)。文章还提醒了常
2025-11-01 23:04:39
987
原创 LeetCode算法日记 - Day 88: 环绕字符串中唯一的子字符串
题目要求统计字符串s中所有不同且符合字母表循环顺序的子串个数。通过动态规划记录以每个字符结尾的最长连续子串长度,并利用哈希表去重。具体步骤:1)初始化dp数组记录以每个位置结尾的最长连续长度;2)遍历字符串更新dp值,处理z-a的循环边界;3)用哈希表记录每个字符对应的最大连续长度;4)累加哈希表中的值即为答案。该方法将时间复杂度优化到O(n),空间复杂度O(n)。关键点在于理解最长连续子串自动包含所有较短子串的特性,实现高效去重统计。
2025-10-29 20:22:04
1104
原创 LeetCode算法日记 - Day 87: 单词拆分
本文探讨了LeetCode单词拆分问题的动态规划解法。给定字符串s和单词字典wordDict,判断能否使用字典中的单词拼接出完整字符串。通过定义dp[i]表示前i个字符能否拆分,利用双层循环枚举所有可能分割点j,若前j个字符可拆分且剩余部分在字典中,则标记dp[i]为true。关键优化包括:字典转为HashSet以提高查询效率,字符串下标对齐处理,以及及时终止不必要的内层循环。该方法时间复杂度O(n²×L),空间复杂度O(n+m),有效解决了递归回溯导致的重复计算问题。
2025-10-29 20:21:55
830
原创 LeetCode算法日记 - Day 86: 最长湍流子数组
本文介绍了求解最长湍流子数组的动态规划解法。湍流子数组要求相邻元素比较符号交替变化(上升/下降)。通过定义两个状态数组f和g,分别记录以当前元素结尾且最后一步上升/下降的最长子数组长度。状态转移根据当前比较结果更新:上升接在下降后,下降接在上升后,相等时重置。算法时间复杂度O(n),空间复杂度O(n)。关键点在于正确实现状态转移和及时更新全局最大值。
2025-10-27 10:24:25
622
原创 LeetCode算法日记 - Day 85: 等差数列划分
该文章探讨了如何统计数组中所有连续等差子数组的数量。文章首先通过示例说明等差数列的定义,指出暴力枚举法的时间复杂度问题。然后提出动态规划解法,通过记录以每个元素结尾的等差子数组个数来优化计算,将时间复杂度降至O(n)。详细解释了状态转移方程和实现步骤,并给出了Java代码示例。最后分析了算法的时间复杂度为O(n),空间复杂度为O(n)(使用dp数组)。文章还特别提醒了常见的易错点和边界条件处理。
2025-10-27 10:24:16
1015
原创 LeetCode算法日记 - Day 84: 乘积为正数的最长子数组长度
【摘要】本文解析了LeetCode问题「乘积为正数的最长子数组长度」。该问题要求在整数数组中找到乘积为正数的最长连续子数组。通过分析符号变化规律(偶数个负数得正,奇数个负数得负),提出动态规划解法:维护两个状态数组f和g,分别记录以当前元素结尾的乘积为正/负的最长子数组长度。关键点在于处理正数、负数、零时的状态转移策略,其中负数会反转乘积符号,而零则重置计数。算法时间复杂度优化至O(n),空间复杂度O(n)。文中还给出了Java实现代码及易错点提示。
2025-10-25 20:55:04
1333
原创 LeetCode算法日记 - Day 83: 乘积最大的子数组
本文介绍了求解数组中乘积最大连续子数组的动态规划解法。核心思路是维护两个状态数组max和min,分别记录以当前位置结尾的子数组的最大和最小乘积。通过同时跟踪这两个状态,可以正确处理正负数的乘积翻转情况。具体实现时,每个位置的状态转移需要比较当前元素、前一个最大值乘积和最小值乘积三种情况。该方法将时间复杂度优化至O(n),空间复杂度为O(n)。文章详细分析了算法思路、状态转移方程、实现细节和常见错误,并提供了完整的Java代码实现。
2025-10-25 20:55:00
809
原创 LeetCode算法日记 - Day 82: 环形子数组的最大和
本文介绍了求解环形数组中最大子数组和的问题。通过分析常规动态规划算法在处理环形数组时的局限性,提出将问题分解为两种情况:不跨边界的最大子数组和(用f[i]记录)与跨边界情况(用g[i]记录最小子数组和,总和减去最小值得到跨边界最大值)。文章详细说明了状态转移方程、边界条件处理(全负数情况)和代码实现,并指出该算法的时间复杂度为O(n),空间复杂度可优化至O(1)。关键点在于理解"总和减最小子数组和"的转换思想。
2025-10-23 22:50:56
1014
原创 LeetCode算法日记 - Day 81: 最大子数组和
本文介绍了求解最大子数组和问题的动态规划解法。题目要求在整数数组中找到和最大的连续子数组。常规暴力解法时间复杂度为O(n²),不适用于大规模数据。动态规划解法定义dp[i]表示以nums[i]结尾的最大子数组和,递推公式为dp[i] = max(dp[i-1]+nums[i], nums[i]),时间复杂度优化至O(n)。文中给出了Java实现代码,并分析了初始化和索引偏移等易错点。该方法通过避免重复计算,显著提高了效率,空间复杂度为O(n),也可进一步优化至O(1)。
2025-10-23 22:50:46
672
原创 LeetCode算法日记 - Day 80: 买卖股票的最佳时机 IV
【摘要】本文探讨了LeetCode上的股票买卖问题IV,要求在最多进行k笔交易的情况下计算最大利润。通过动态规划方法,构建了持有股票(f[i][j])和不持有股票(g[i][j])两种状态,其中i表示天数,j表示交易次数。状态转移方程考虑了保持持有、买入、保持不持有和卖出四种操作。关键点包括正确初始化边界条件、处理交易次数限制以及最终结果必须取最后一天不持有股票的状态。算法的时间复杂度为O(n×k),空间复杂度可优化至O(k)。该解法有效避免了暴力枚举的高复杂度,适用于大规模数据。
2025-10-21 11:14:50
817
原创 LeetCode算法日记 - Day 79: 买卖股票的最佳时机 III
股票买卖问题III的动态规划解法 该问题要求在最多两次交易条件下获得股票买卖最大利润。采用动态规划方法,定义两个状态数组: f[i][j]:第i天持有股票且已完成j次交易的最大利润 g[i][j]:第i天不持有股票且已完成j次交易的最大利润 关键转移方程: 持有状态:保持或从未持有状态买入 未持有状态:保持或从持有状态卖出(交易次数+1) 初始化时设定第0天持有为极小值,未持有为0。最终取所有状态的最大值。时间复杂度O(n),空间复杂度O(n)。通过状态转移高效避免了暴力枚举的复杂度问题。
2025-10-21 11:14:38
613
原创 LeetCode算法日记 - Day 78: 买卖股票的最佳时机含手续费
本文探讨了股票买卖问题的最优解法,即在考虑交易手续费的情况下,通过无限次交易获得最大利润。采用动态规划方法,定义dp[i][0]和dp[i][1]分别表示第i天持有/不持有股票时的最大利润。通过状态转移方程计算每日最优解,最终返回最后一天不持有股票的最大利润。算法时间复杂度为O(n),空间复杂度为O(n)。关键点包括正确初始化边界条件、统一手续费扣除时机以及防止整数溢出等问题。该方法有效避免了暴力枚举的高复杂度,适用于大规模数据。
2025-10-20 19:44:35
635
原创 LeetCode算法日记 - Day 77: 买卖股票的最佳时机含冷冻期
本文介绍了解决"买卖股票的最佳时机含冷冻期"问题的动态规划方法。该问题要求在卖出股票后需等待一天冷冻期才能再次买入。通过将每日状态分为持有、可交易和刚卖三种情况,建立状态转移方程:持有状态可由前一天持有或从可交易状态买入转移;刚卖状态只能从持有状态卖出转移;可交易状态可由前一天空仓或冷冻期结束转移。使用动态规划记录各状态最大利润,最终取最后一天可交易或刚卖状态的最大值。算法时间复杂度O(n),空间复杂度O(n),可通过滚动数组优化至O(1)。关键点在于正确处理初始状态和避免整数溢出。
2025-10-20 19:44:28
865
原创 LeetCode算法日记 - Day 76: 粉刷房子
本文探讨了粉刷房屋最小成本问题的动态规划解法。给定一排n个房屋,每个房屋可涂红、蓝或绿三种颜色之一,要求相邻房屋颜色不同,且每个颜色对应不同成本。通过定义dp[i][j]表示第i个房屋涂j色的最小成本,建立递推关系式:dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i][0]。算法时间复杂度为O(n),空间复杂度O(n)(可优化为O(1))。核心思想是当前房屋的最优解仅依赖于前一房屋的另外两种颜色选择,从而避免了暴力枚举。代码实现展示了动态规划在处理这类约束条件下的最优化
2025-10-18 10:33:34
1263
原创 LeetCode算法日记 - Day 75: 删除并获得点数
题目摘要: LeetCode 740题要求通过删除数组元素获得最大点数,每次删除一个元素会连带删除相邻值。解法核心是将问题转化为类似"打家劫舍"的动态规划问题:统计每个数字的总价值,用f[i]和g[i]分别表示选/不选数字i时的最大分数。状态转移为f[i]=g[i-1]+当前值,g[i]=max(f[i-1],g[i-1])。最终时间复杂度O(n+max),空间复杂度O(max)。代码实现了统计频次、DP递推和结果比较的关键步骤。
2025-10-18 10:33:22
1026
原创 LeetCode算法日记 - Day 74: 按摩师、打家劫舍II
这篇文章介绍了两个动态规划问题的解法:按摩师预约问题和打家劫舍II问题。 按摩师预约问题要求在不相邻的预约中选择总时长最大的方案。通过定义两个状态数组(f[i]表示选第i个预约的最大时长,g[i]表示不选的最大时长),使用动态规划递推求解,时间复杂度O(n)。 打家劫舍II问题在环形房屋条件下求解不相邻房屋的最大金额。通过"破环为链"策略,将问题分解为两种情况:选第一间房(不选最后一间)和不选第一间房(可选最后一间),分别求解后取最大值。时间复杂度同样为O(n)。 两个问题都采用了类似的
2025-10-16 16:09:45
1488
原创 LeetCode算法日记 - Day 73: 最小路径和、地下城游戏
本文解析了两道动态规划经典问题:1.最小路径和:使用二维DP从左上到右下递推,每个格子取左边和上边的最小值加上当前值。2.地下城游戏:逆向DP从右下到左上推导,每个位置根据右边和下边的最小需求计算当前血量要求。两道题都需注意边界条件和状态转移方程的特殊处理。最小路径和采用正向累积,而地下城游戏必须逆向推导才能确保结果正确。时间复杂度均为O(mn),空间复杂度均为O(mn)。
2025-10-16 16:09:36
624
原创 LeetCode算法日记 - Day 72: 下降路径最小和、珠宝的最高价值
本文解析了两个动态规划问题:矩阵最小下降路径和与珠宝架最大价值路径。第一个问题要求在n×n矩阵中,从第一行任意位置出发,每次向下移动到相邻三个位置之一,找到最小路径和。使用动态规划,递推公式为dp[i][j]=matrix[i][j]+min(dp[i-1][j±1]),时间复杂度O(n²)。第二个问题从左上角出发,每次向右或向下移动,求到达右下角的最大珠宝价值。递推公式为dp[i][j]=frame[i][j]+max(dp[i-1][j], dp[i][j-1]),同样具有O(mn)复杂度。两个问题都通
2025-10-14 21:40:17
732
原创 LeetCode算法日记 - Day 71: 不同路径、不同路径II
本文介绍了两个动态规划解决网格路径问题的算法:1. 基本版不同路径:机器人从m×n网格左上角移动到右下角,每次只能向右或向下移动,使用动态规划计算路径数。解法为创建dp数组,递推公式dp[i][j]=dp[i-1][j]+dp[i][j-1],时间复杂度O(mn)。2. 带障碍物版本:网格中存在障碍物标记为1,机器人无法通过。解法需先判断起点是否为障碍物,若遇到障碍物则dp[i][j]=0,否则仍按原公式计算。两个问题都采用自底向上的填表方法,避免重复计算,保证算法效率。
2025-10-14 21:39:51
806
原创 LeetCode算法日记 - Day 70: 使用最小花费爬楼梯、解码方法
本文解析了两道动态规划经典问题: 最小花费爬楼梯:通过dp[i]记录到达第i台阶的最小花费,状态转移方程为dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]),初始状态dp[0]=dp[1]=0,时间复杂度O(n)。 解码方法:统计数字字符串的有效解码方案数,dp[i]表示前i+1个字符的解码总数。需处理'0'的特殊情况,状态转移考虑单独解码(1-9)和组合解码(10-26),边界条件需单独处理首字符,时间复杂度O(n)。两题均可用动态规划避免重复计算,优化递归
2025-10-12 12:59:27
1222
原创 LeetCode算法日记 - Day 69: 第 N 个泰波那契数、三步问题
本文解析了两个递推问题:1. 第N个泰波那契数:定义T0=0,T1=1,T2=1,后续项为前三项和。使用动态规划解法,创建dp数组存储中间结果,时间复杂度O(n),空间复杂度O(n)。2. 三步爬楼梯问题:计算小孩上n阶楼梯的方式数(每次可走1/2/3阶)。采用类似思路,注意结果需取模1000000007防止溢出。两个问题都通过动态规划避免了递归的重复计算,将指数复杂度优化为线性复杂度。
2025-10-12 12:58:51
1527
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅