
动态规划
leetcode动态规划
why_1513
求实求真,大气大气
展开
-
编辑距离-力扣
相比,多了增加操作与替换操作。但word2添加一个元素,相当于word1删除一个元素,同理,word1增加一个元素相当于word2删除一个元素,那么 添加与删除操作,实际上是等价的。而替换操作 对单词 word1 替换一个字符和对单词 word2 替换一个字符是等价的。这道题在看到时,想到要讨论的状态很多,感到无从下手。原创 2024-07-01 22:33:07 · 243 阅读 · 0 评论 -
两个字符串的删除操作-力扣
当word1[i - 1] 与 word2[j - 1]相同的时候,将这两个相同的字符称为公共字符,考虑使 word1[0:i−1]和word2[0:j−1] 相同的最少删除操作次数,增加一个公共字符之后,最少删除操作次数不变,因此 dp[i][j]=dp[i−1][j−1]。当word1[i - 1] 与 word2[j - 1]不相同的时候,使 word1[0:i−1] 和 word2[0:j] 相同的最少删除操作次数,加上删除 word1[i−1] 的 1 次操作;同理 dp[0][j] = j。原创 2024-07-01 22:05:05 · 288 阅读 · 0 评论 -
最长回文子串-力扣
本题求的是最长回文子串,那么在回文子串题目上,增加对字符串的切割即可,并始终保存最大回文子串。原创 2024-07-01 21:19:45 · 97 阅读 · 0 评论 -
最长回文子序列-力扣
【代码】最长回文子序列-力扣。原创 2024-07-01 21:01:37 · 215 阅读 · 0 评论 -
回文子串-力扣
动态规划解法,在定义dp数组时,不是定义成字符串前 i 个字符回文子串的个数,而是布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。本题要求回文子串,自己想到的解法是记录前一位字符串的回文子串次数,然后判断当前字符串的回文子串次数,时间复杂度高达O(n^3);原创 2024-07-01 20:26:01 · 704 阅读 · 0 评论 -
不同的子序列-力扣
dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。原创 2024-07-01 16:22:06 · 471 阅读 · 0 评论 -
判断子序列-力扣
将这道题作为 编辑距离的入门题目 ,本题的动态规划解法是对后面要讲解的编辑距离铺垫,所以学习了他使用动态规划的解法。本题首先想到的写法是用双指针来做,两个指针分别指向两个字符串,然后进行判断。原创 2024-07-01 15:11:48 · 350 阅读 · 0 评论 -
最大子序和-力扣
这道题目一开始在想遇到负数就从下一个正数开始计算,并和记录的最大和相比,但有些子序列,即使子序列中存在负数,但整体的和还是最大的,不能单纯的跳过。原创 2024-06-18 22:06:00 · 229 阅读 · 0 评论 -
不相交的线-力扣
本题是要寻找两个数组中,不相交的直线,那么就是要取求两个数组中,最长公共子序列,这个子序列中元素不能改变其在数组中的相对位置。那么就与 最长公共子序列 这道题目相同了。原创 2024-07-01 11:13:15 · 275 阅读 · 0 评论 -
最长公共子序列-力扣
本题和最长重复子数组的区别在于,子序列可以是不连续的,在最长重复子数组中,如果nums1[i]!= nums2[j],那么 dp[i][j] 就是默认初始化的值 0;现在由于子序列可以不连续,那么此时dp[i][j]的值就要从dp[i - 1][j] 和 dp[i][j - 1]来考虑,选择其较大值。原创 2024-07-01 10:49:25 · 309 阅读 · 0 评论 -
最长重复子数组-力扣
【代码】最长重复子数组-力扣。原创 2024-06-30 18:12:51 · 166 阅读 · 0 评论 -
最长连续递增序列-力扣
【代码】最长连续递增序列-力扣。原创 2024-06-30 15:34:32 · 157 阅读 · 0 评论 -
最长递增子序列-力扣
上述动态规划的解法,其时间复杂度为O(N * N),力扣进阶所要求的时间复杂度为O(NlogN),需要使用贪心的思想来进行实现。,用 len 记录目前最长上升子序列的长度,起始时 len 为 1,d[1]=nums[0];利用贪心的思想维护一个单调递增数组。原创 2024-06-30 14:41:45 · 441 阅读 · 0 评论 -
买卖股票的最佳时机含手续费
本题和买卖股票的最佳时机II的区别就是在卖出股票时需要多一个减去手续费的操作。原创 2024-06-28 21:20:32 · 131 阅读 · 0 评论 -
买卖股票的最佳时机含冷冻期-力扣
本题与买卖股票的最佳时机Ⅱ的区别在于增加了出售股票后,会出现一天的冷冻期,那么持有股票时的最大利润,只能在 前一天持有股票 和 两天前不持有股票状态选择最大值。原创 2024-06-28 20:18:10 · 118 阅读 · 0 评论 -
买卖股票的最佳时机Ⅳ-力扣
本题是买卖股票的最佳时机Ⅲ的升级版,在Ⅲ中,能够买入卖出两次,因此能够将每天分为四种或者五物种状态,那么当能够买入卖出 k 次时,我们便能够将每天分为 2k + 1种状态,并且奇数状态 和 偶数状态的递推公式存在不同点,(不分为 2k 种 是为了便于使用for循环来更新第 i 天 奇数偶数种类的状态。原创 2024-06-28 16:56:03 · 210 阅读 · 0 评论 -
买卖股票的最佳时机III-力扣
dp 数组的值 为每天的最大现金,因此取两者的最大值 dp[i][0] = max(dp[i - 1][0], - prices[i]);操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][0] = dp[i - 1][0]操作一:第i天买入股票了,那么dp[i][0] = - prices[i]dp[i][0] – dp[i][3] 分别表示上述状态时获得的最大现金。第0天做第一次买入的操作,dp[0][0] = -prices[0];第0天做第二次出售操作,dp[0][3] = 0;原创 2024-06-28 11:32:52 · 494 阅读 · 0 评论 -
买卖股票的最佳时机Ⅱ-力扣
本题需要求的是最大的利润,本题中理解利润拆分是关键点!不要整块的去看,而是把整体利润拆为每天的利润。一旦想到这里了,很自然就会想到贪心了,即:只收集每天的正利润,最后稳稳的就是最大利润了。原创 2024-06-19 11:58:35 · 164 阅读 · 0 评论 -
买卖股票的最佳时机-力扣
因为股票就买卖一次,那么贪心的想法就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。原创 2024-06-27 19:52:48 · 241 阅读 · 0 评论 -
打家劫舍Ⅲ-力扣
这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。所以dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}通过递归左节点,得到左节点偷与不偷的金钱。原创 2024-06-27 17:12:29 · 257 阅读 · 0 评论 -
打家劫舍Ⅱ-力扣
我们只需要执行两次 打家劫舍 就可以,一次以第一个房子为起点,倒数第二个房子为终点,一次以第二个房子为起点,最后一个房子为终点,最后选择两次结果的最大值即可。本题和 打家劫舍 的区别在于房屋围成了一圈,那么在选了第一个房子,就无法选择最后一个房子;选了最后一个房子,就无法选择第一个房子。原创 2024-06-27 15:25:22 · 241 阅读 · 0 评论 -
打家劫舍-力扣
【代码】打家劫舍-力扣。原创 2024-06-27 14:16:59 · 152 阅读 · 0 评论 -
携带矿石资源-卡玛(多重背包理论基础)
本题是纯村的多重背包问题,有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。把问题中每个物品的数量展开,那么就相当于 有有限个重复物品的 0-1背包问题,只需要在两层for循环中添加一层for循环,对重复物品进行遍历即可。原创 2024-06-27 11:39:05 · 183 阅读 · 0 评论 -
单词拆分-力扣
单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包!原创 2024-06-26 22:22:34 · 261 阅读 · 0 评论 -
完全平方数-力扣
本题可转化为完全背包问题,背包的容量为 n, 但 物品 并未直接给出, 而是通过遍历 i, 物品大小和价值,便是 i * i。原创 2024-06-26 21:33:52 · 166 阅读 · 0 评论 -
零钱兑换-力扣
本题同样可转换为完全背包问题。原创 2024-06-26 21:16:54 · 219 阅读 · 0 评论 -
爬楼梯(进阶版)-卡玛
本题是爬楼梯的进阶版,假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?不难发现,本题能够抽象为 完全背包问题。原创 2024-06-26 20:48:00 · 200 阅读 · 0 评论 -
组合总和Ⅳ-力扣
本题是一道完全背包问题,需要注意的点是顺序不同的序列被视作不同的组合。那么需要求得便是 排列 的次数,需要 首先对背包容量进行遍历,嵌套循环对物品进行遍历。原创 2024-06-26 19:50:33 · 142 阅读 · 0 评论 -
零钱兑换Ⅱ-力扣
本题转化为完全背包问题。原创 2024-06-26 16:38:16 · 200 阅读 · 0 评论 -
携带研究材料-卡玛(完全背包理论基础)
当使用滚动数组来进行优化时,与0-1背包问题的区别在于 内层嵌套循环遍历不再是从后往前的顺序,而是从前往后的顺序,这代表了每个物品可以重复选取。完全背包与0-1背包的区别在于,每种物品有无限件,因此完全背包使用 二维 dp 数组 的初始化和递推公式与0-1背包存在一定的区别。原创 2024-06-26 16:08:35 · 577 阅读 · 0 评论 -
一和零-力扣
本题抽象为0-1背包问题,关键在于抽象后的背包是一个二维背包,此时 dp[i][j] 中 i 不再表示物品的种类,而是物品重量的一个维度。原创 2024-06-26 11:17:46 · 182 阅读 · 0 评论 -
目标和-力扣
所以我们要求的是 x - (sum - x) = target。假设加法的总和为x,那么减法对应的总和就是sum - x。此时问题就转化为,装满容量为x的背包,有几种方法。原创 2024-06-25 23:15:18 · 160 阅读 · 0 评论 -
最后一块石头的重量Ⅱ-力扣
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。原创 2024-06-25 22:00:00 · 213 阅读 · 0 评论 -
分割等和子集-力扣
本题可以转化为0-1背包问题,分割等和子集,那么需要在给定的数组中,找到一个和为 sum / 2的集合,那么可以将问题转化为,背包的大小为 sum / 2, 物品的种类为 nums.size() 个,物品的价值 和 重量 都为 nums[i]。空间优化:使用滚动数组,则遍历背包时,需要从后往前进行遍历,因为更新 dp[j] 需要左侧的值,不能先更新左侧的值。原创 2024-06-25 16:24:59 · 204 阅读 · 0 评论 -
携带研究材料-卡玛 (0-1背包理论基础)
【代码】携带研究材料-力扣。原创 2024-06-25 10:54:32 · 1046 阅读 · 0 评论 -
不同的二叉搜索树-力扣
本题将二叉搜索树分为左侧子树节点个数和右侧子树节点个数,然后 从0 到 节点个数的排列顺序进行累加。原创 2024-06-24 21:39:00 · 254 阅读 · 0 评论 -
整数拆分-力扣
【代码】整数拆分-力扣。原创 2024-06-24 21:14:40 · 255 阅读 · 0 评论 -
不同路径Ⅱ-力扣
本题与 不同路径 的区别在于增加了障碍物,需要在 不同路径 的代码上增加对障碍物的判断。原创 2024-06-24 11:14:51 · 262 阅读 · 0 评论 -
不同路径-力扣
【代码】不同路径-力扣。原创 2024-06-24 10:35:20 · 215 阅读 · 0 评论 -
使用最小花费爬楼梯-力扣
【代码】使用最小花费爬楼梯-力扣。原创 2024-06-21 16:21:41 · 160 阅读 · 0 评论