动态规划
Rutifrl
这个作者很懒,什么都没留下…
展开
-
376. 摆动序列
难度中等260收藏分享切换为英文接收动态反馈如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如,[1,7,4,9,2,5]是一个摆动序列,因为差值(6,-3,5,-7,3)是正负交替出现的。相反,[1,4,7,2,5]和[1,7,4,5,5]不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长...原创 2020-11-06 14:34:49 · 78 阅读 · 0 评论 -
646. 最长数对链
给出n个数对。在每一个数对中,第一个数字总是比第二个数字小。现在,我们定义一种跟随关系,当且仅当b < c时,数对(c, d)才可以跟在(a, b)后面。我们用这种形式来构造一个数对链。给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。示例:输入:[[1,2], [2,3], [3,4]]输出:2解释:最长的数对链是 [1,2] -> [3,4]相似题目:https://blog.cs...原创 2020-11-04 17:02:58 · 169 阅读 · 0 评论 -
300. 最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。/*dp[i]表示从nums[0:i]中最长上升子序列的长度,如果nums[j] < nums[i],j < i,那么dp[i] = dp[j] + 1时间复杂度O(n*n)*/class Solution {public: int lengthOfLIS(vector&l..原创 2020-11-04 16:31:28 · 73 阅读 · 0 评论 -
91. 解码方法
一条包含字母A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。题目数据保证答案肯定是一个 32 位的整数。示例 1:输入:"12"输出:2解释:它可以解码为 "AB"(1 2)或者 "L"(12)。dp[i]表示从位置0开始长度为i的字符串中解码方法的总数,合法字母是1或者2位数,首先s[:i-1]的解码方式后加上s[i]也是合法的(s[i]!=0),对..原创 2020-11-04 15:23:09 · 179 阅读 · 0 评论 -
279. 完全平方数
给定正整数n,找到若干个完全平方数(比如1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.令dp[i]为组成和i的完全平方数的最小个数那么,有i-j*j+j*j=i,dp[i-j*j]+1是可能的答案dp[i]=min(dp[i-j*j])+1,j*j&...原创 2020-11-04 14:46:38 · 124 阅读 · 0 评论 -
343. 整数拆分
给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。另dp[i]表示正整数i的最大乘积把i拆分为i-j+j=i,j<=(i-1),因为如果j大于等于i那么乘积就不是正整数了,那么(i-j)*j如果再把(i-j)也拆开,对应的乘积就是dp[i-j]*j两个取最大值class Solution {public: int inte...原创 2020-11-04 14:03:13 · 83 阅读 · 0 评论 -
413. 等差数列划分
如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,以下数列为等差数列:1, 3, 5, 7, 97, 7, 7, 73, -1, -5, -9以下数列不是等差数列。1, 1, 2, 5, 7数组 A 包含 N 个数,且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q),P 与 Q 是整数且满足 0<=P<Q<N 。如果满足以下条件,则称子数组(P, Q)为等差数组:元素 A[P], A[p + 1], ...,.原创 2020-11-03 22:53:19 · 121 阅读 · 0 评论 -
62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -> 向下2. 向右 -> 向下 -> 向右3. 向下 -> 向右 -> 向右对于第一行和第一列上的所有格子,路径数原创 2020-11-03 22:09:03 · 149 阅读 · 0 评论 -
64. 最小路径和
给定一个包含非负整数的 mxn网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小因为是从左上角走到右下角,只能往下或者右走设dp[i]表示走到第i列路径和的最小值,从左到右遍历时,那么对于每一行中的列,左上角的路径和是dp[i-1],上边的路径和是dp[i],更新这一行的d...原创 2020-11-03 20:50:36 · 148 阅读 · 0 评论 -
213. 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。示例1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他..原创 2020-11-03 19:25:02 · 61 阅读 · 0 评论 -
198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。...原创 2020-11-03 14:29:15 · 67 阅读 · 0 评论 -
70. 爬楼梯
假设你正在爬楼梯。需要 n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶dp[i] 表示走到第 i 个楼梯的方法数目。第 i 个楼梯可以从第 i-1 和 i-2 个楼梯再走一步到达,走到第 i 个楼梯的方法数为走到第 i-1 和第 i-2 个楼梯的方法数之和dp[i] = dp[i-1] + dp[...原创 2020-11-03 13:56:10 · 99 阅读 · 0 评论 -
97. 交错字符串(hard)
给定三个字符串s1、s2、s3,请你帮忙验证s3是否是由s1和s2 交错 组成的。两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:s = s1 + s2 + ... + snt = t1 + t2 + ... + tm|n - m| <= 1交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...提示:a + b 意味着字符串 a 和...原创 2020-10-25 12:47:34 · 81 阅读 · 0 评论 -
1012. 至少有 1 位重复的数字(hard)
给定正整数N,返回小于等于 N且具有至少 1 位重复数字的正整数的个数。示例 1:输入:20输出:1解释:具有至少 1 位重复数字的正数(<= 20)只有 11 。转化为求都不重复的正整数的个数例如3562高位是04th3th2th1thtotal0001-99xA(9,0)001-90-99xA(9,1)01-90-90-99xA(9,2)高位不是04th3th2...原创 2020-10-25 12:46:58 · 172 阅读 · 0 评论 -
968. 监控二叉树(hard)
给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。输入:[0,0,null,0,0]输出:1解释:如图所示,一台摄像头足以监控所有节点。贪心+dp,贪心的情况是,叶子节点的父节点装摄像头是数量最少的,状态有三种:0,本节点无覆盖1,本节点有摄像头2。本节点有覆盖空节点的状态只能是有覆盖四类情况:1.左右节点都有覆盖(不需要相机)2.左右节点至少有一...原创 2020-10-25 12:46:34 · 90 阅读 · 0 评论 -
887. 鸡蛋掉落(hard)
你将获得K个鸡蛋,并可以使用一栋从1到N共有 N层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层F ,满足0 <= F <= N 任何从高于 F的楼层落下的鸡蛋都会碎,从F楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层X扔下(满足1 <= X <= N)。你的目标是确切地知道 F 的值是多少。无论 F 的初始值如何,你确定 F 的值的最小...原创 2020-10-24 00:32:21 · 108 阅读 · 0 评论 -
634. 寻找数组的错位排列
在组合数学中,如果一个排列中所有元素都不在原先的位置上,那么这个排列就被称为错位排列。给定一个从1 到 n升序排列的数组,你可以计算出总共有多少个不同的错位排列吗?由于答案可能非常大,你只需要将答案对 109+7 取余输出即可。样例 1:输入: 3输出: 2解释: 原始的数组为 [1,2,3]。两个错位排列的数组为 [2,3,1] 和 [3,1,2]。dp[n]表示长度为n的完美数据有多少种变成错位数组的方案dp[k]=(dp[k-1]+dp[k-2])*(n-...原创 2020-10-24 00:31:20 · 216 阅读 · 0 评论 -
1035. 不相交的线
我们在两条独立的水平线上按给定的顺序写下A和B中的整数。现在,我们可以绘制一些连接两个数字A[i]和B[j]的直线,只要A[i] == B[j],且我们绘制的直线不与任何其他连线(非水平线)相交。以这种方法绘制线条,并返回我们可以绘制的最大连线数。示例 1:输入:A = [1,4,2], B = [1,2,4]输出:2解释:我们可以画出两条不交叉的线,如上图所示。我们无法画出第三条不相交的直线,因为从 A[1]=4 到 B[2]=4 的直线将与从 A[2]...原创 2020-10-23 01:24:30 · 278 阅读 · 0 评论 -
5. 最长回文子串
给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为 1000。输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。动态规划,dp[i][j]=true表示s[i]-s[j]是回文子串,i<j当s[i]=s[j]时,如果j-i<2,s[i]-s[j]一定是,如果dp[i+1][j-1]=true,s[i]-s[j]也一定是class Solution {public: string longestPalin...原创 2020-10-23 01:21:47 · 59 阅读 · 0 评论 -
718. 最长重复子数组
给两个整数数组A和B,返回两个数组中公共的、长度最长的子数组的长度。输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 动态规划,dp[i][j]表示A中前i个数字和B中前j个数字中最长子数组的长度所以,当A[i]=B[j],dp[i][j]=dp[i-1][j-1]+1如果A[i]不等于B[j],dp[i][j]=0class Solution {public: ...原创 2020-10-23 01:17:32 · 67 阅读 · 0 评论