动态规划
文章平均质量分 75
呜呜呜
YXXYX
精通CV编程
展开
-
判断子序列&&不同的子序列&&两个字符串的删除操作&&编辑距离
引言下面的四种题相互间都有联系,都是类似编辑距离类的题目,这里从简单开始,逐渐深入;判断子序列给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例 1:输入:s = “abc”, t = “ahbgdc”输出:true示例 2:输入:s = “axc”, t = “ahbgdc”输出:false提示:0 &l原创 2021-08-03 18:41:26 · 304 阅读 · 0 评论 -
最长重复子数组&&最长公共子序列&&不相交的线
引言这同样是两种类型的题目,有很多相似的地方和不同的地方,区别依然是连续和不连续之分。最长重复子数组给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。提示:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100这道题中说的子数组,其实就是连续的子序列,1,d原创 2021-08-03 11:53:10 · 436 阅读 · 0 评论 -
最长递增子序列 && 最长连续递增序列
引言这两道题有很大的相似性,在这里主要的地方就是循环的设置,不仅仅适用于这两道题,在很多类似的题目中都可以用到,要学会相应的方法才行;最长递增子序列给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101]原创 2021-08-02 12:09:49 · 604 阅读 · 0 评论 -
买股票的最佳时机(六种题解dp)
引言买股票的最佳时机类的题目也是很经典的动态规划题目,出题人通过各种花里胡哨的买股票方法来考察(虐待)你,下面我们就开始看看一类的题目的各种花样;买股票的最佳时机给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,原创 2021-08-01 23:04:07 · 454 阅读 · 1 评论 -
打家劫舍系列(dp)
引言打家劫舍类的题目是动态规划里的经典题目,有很多种变换形式,下面就介绍一下力扣里面的所有打家劫舍的题目;打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷原创 2021-08-01 18:03:14 · 194 阅读 · 0 评论 -
完全背包问题
引言完全背包和01背包最大的区别就是:完全背包中装背包的物品可以重复使用多次,这里还是拿经典的背包问题论述;问题:有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。这就是完全背包问题,但是其实和01背包就区别在每种物品有无限件。其他几乎一模一样,那么这道题该怎么解决呢?步骤和01背包一样,这里只说区分点:不同之处就在于循环顺序上,01背包内部的循原创 2021-07-31 21:07:27 · 228 阅读 · 0 评论 -
接雨水(动态规划)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9提示:n == height.length0 <= n <= 3 *原创 2021-07-31 11:56:13 · 552 阅读 · 0 评论 -
一和零(二维01背包)
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。示例 1: 输入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3输出:4解释:最多有 5 个 0 和 3 个 1 的最大子集是 {“10”,“0001”,“1”,“0”} ,因此答案是 4 。其他满足题意但原创 2021-07-31 11:41:22 · 158 阅读 · 0 评论 -
目标和(01背包应用)
给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。示例 1:输入:nums = [1,1,1,1,1], target = 3输出:5解释:一共有 5 种方法让最终目标和为 3 。-原创 2021-07-30 17:53:47 · 264 阅读 · 0 评论 -
01背包问题
引言01背包问题是最经典的一种背包类型,在面试题中经常会遇到,在这我就来详细的聊一聊01背包问题的一些细节和解法;01背包问题有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求背包放哪些物品后价值最大。 ps:weight数组的大小 就是物品个数题解1,设dp[i][j]表示从下标[0~i]的物品中任取,放到容量为j的背包中的最大总价值;2,转移方程:(两种情况)2.1,背包放不下物品 i 时(此时物品原创 2021-07-29 21:41:13 · 263 阅读 · 0 评论 -
动态规划(浅层基础)
引言在我看来动态规划和递归有很大的相似性,可以说动态规划就是剪枝后的递归,它舍去了递归重复的步骤,在时间复杂度上相对于递归有着非常大的提升,就比如说斐波那契数列(下题有)用递归的时间复杂度是指数级,而用动态规划则可以将其优化为线性级,且动态规划还可以继续进行优化使其空间复杂度大大减小,这就是动态规划进阶的内容了;做动态规划类的题目有很多相似的套路和方法,开始肯定会有一些困难,题目见多了就会发现好多题有着相似的解法;我的一般做题步骤是:1,先找最后一步并定义一个dp[i]数组元素的含义(不一定是数组由原创 2021-07-23 22:37:34 · 322 阅读 · 0 评论 -
最大子列和问题
给定K个整数组成的序列{ N1, N2, …, NK },“连续子列”被定义为{ Ni, Ni+1, …, Nj },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:数据1:与样例等价,测试基本正确性;原创 2021-05-15 08:39:56 · 139 阅读 · 0 评论 -
最大搜索二叉子树大小(树形dp)
给定一颗二叉树的头节点head,返回这棵二叉树中最大的二叉搜索子树(二叉搜索树:该二叉树中左子树所有节点比它小,右子树所有节点比它大 );思路:这是一道分析可能性求解在二叉树上做类似动态规划的问题(树形dp),这种题就是一种递归套路,我们要分析求解的可能性,并由此找到我们所需要的信息,进而通过递归求解;这道题有两种可能性:1,与头节点无关所需信息:1.1,左树最大二叉搜索树大小1.2,右树最大二叉搜索树大小2,与头节点有关所需信息:2.1,左树为二叉搜索树2.2,右树为二叉搜索树2原创 2021-07-12 11:51:16 · 276 阅读 · 0 评论