动态规划
十一月的嚣张
这个作者很懒,什么都没留下…
展开
-
丑数 过
两道题目丑数超级丑数没想到这题还能用DP,第二道处理重复值上需要借鉴思考原创 2021-04-11 23:30:22 · 94 阅读 · 0 评论 -
32. 最长有效括号
32. 最长有效括号原创 2020-11-15 21:52:21 · 97 阅读 · 0 评论 -
53. 最大子序和与152. 乘积最大子数组
53. 最大子序和与152. 乘积最大子数组这两道题有相似之处,所以放在了一起记录题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。思路可以用动态规划来做,设数组元素f[i]表示包含第i个元素的最大和的连续子数组,那么转移方程是f[i]=max(f[i−1]+A[i],A[i])f[i] = max(f[原创 2020-11-07 23:40:24 · 92 阅读 · 0 评论 -
120. 三角形最小路径和
120. 三角形最小路径和题目给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。思路这题是典型的动态规划题目,定义数组f[i][j]表示第i层第j个元素为终点时的路径和,转移方程为f[i][j]=Math.min(f[i−1][j−1],f[i−1][j])+A[i][原创 2020-11-07 20:48:18 · 69 阅读 · 0 评论 -
1458. 两个子序列的最大点积 过
1458. 两个子序列的最大点积题目给你两个数组 nums1 和 nums2 。请你返回 nums1 和 nums2 中两个长度相同的 非空 子序列的最大点积。数组的非空子序列是通过删除原数组中某些元素(可能一个也不删除)后剩余数字组成的序列,但不能改变数字间相对顺序。比方说,[2,3,5] 是 [1,2,3,4,5] 的一个子序列而 [1,5,3] 不是。示例 1:输入:nums1 = [2,1,-2,5], nums2 = [3,0,-6]输出:18解释:从 nums1 中得到子序列 [原创 2020-11-01 23:59:54 · 92 阅读 · 0 评论 -
139. 单词拆分
139. 单词拆分题目给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。思路定义dp[i]表示前i个字符组成的字符串是否可以被拆分,原创 2020-11-01 23:42:43 · 108 阅读 · 0 评论 -
72. 编辑距离
72. 编辑距离原创 2020-10-29 11:07:01 · 117 阅读 · 0 评论 -
343. 整数拆分
343. 整数拆分原创 2020-10-29 11:05:51 · 76 阅读 · 0 评论 -
1105. 填充书架
1105. 填充书架原创 2020-10-29 11:05:13 · 90 阅读 · 0 评论 -
647. 回文子串
647. 回文子串原创 2020-10-29 11:04:06 · 66 阅读 · 0 评论 -
516. 最长回文子序列 VS 5. 最长回文子串
516. 最长回文子序列 VS 5. 最长回文子串原创 2020-10-29 11:03:29 · 71 阅读 · 0 评论 -
115. 不同的子序列
115. 不同的子序列原创 2020-10-29 11:00:16 · 59 阅读 · 0 评论 -
1024. 视频拼接
1024. 视频拼接原创 2020-10-29 10:59:08 · 100221 阅读 · 0 评论 -
312. 戳气球
312. 戳气球原创 2020-10-29 10:58:32 · 157 阅读 · 1 评论 -
87. 扰乱字符串
87. 扰乱字符串原创 2020-10-29 10:57:57 · 78 阅读 · 0 评论 -
44. 通配符匹配
44. 通配符匹配题目给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s =原创 2020-10-24 21:23:06 · 267 阅读 · 0 评论 -
10. 正则表达式匹配
10. 正则表达式匹配题目给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例 1:输入:s = “aa” p = “a”输出:false解释:“a” 无法匹配 “aa” 整个字符串。思路定义f[i][j]表示s的前i个元素组成的字符串,是否可以被p的前j个元素组成的字符串识别。接下来定义转移过程:当s[i-1]=原创 2020-10-24 21:13:59 · 175 阅读 · 0 评论 -
564. 组合总和 IV
564. 组合总和 IV题目描述给出一个都是正整数的数组 nums,其中没有重复的数。从中找出所有的和为 target 的组合个数。一个数可以在组合中出现多次。数的顺序不同则会被认为是不同的组合。您在真实的面试中是否遇到过这个题?样例样例1输入: nums = [1, 2, 4] 和 target = 4输出: 6解释:可能的所有组合有:[1, 1, 1, 1][1, 1, 2][1, 2, 1][2, 1, 1][2, 2][4]来源:https://www.lint原创 2020-10-24 21:02:58 · 153 阅读 · 0 评论 -
394. 硬币排成线
394. 硬币排成线题目描述有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。请判定 先手玩家 必胜还是必败?若必胜, 返回 true, 否则返回 false.您在真实的面试中是否遇到过这个题?样例样例 1:输入: 4输出: true解释:先手玩家第一轮拿走一个硬币, 此时还剩三个.这时无论后手玩家拿一个还是两个, 下一次先手玩家都可以把剩下的硬币拿完.来源:https://www.lintcode.com/p原创 2020-10-22 22:53:46 · 135 阅读 · 0 评论 -
面试题 08.11. 硬币 过
面试题 08.11. 硬币题目硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)示例1:输入: n = 5输出:2解释: 有两种方式可以凑成总金额:5=55=1+1+1+1+1思路和零钱兑换 II的思路是一样的,或者说基本上就是一道题代码 public int waysToChange(int n) { int f[][] = new int[5][n+1];原创 2020-10-22 22:42:45 · 113 阅读 · 0 评论 -
322. 零钱兑换 过
322. 零钱兑换题目给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1思路定义f[i]表示当金额为i时,所需要的最小硬币的个数。以上面例子中的数据为例,转移方程为f[i]=min{f[i−1]+1,f[i−2]+1,f[i−5原创 2020-10-22 22:32:27 · 99 阅读 · 0 评论 -
437. 书籍复印
437. 书籍复印题目描述给定 n 本书, 第 i 本书的页数为 pages[i]. 现在有 k 个人来复印这些书籍, 而每个人只能复印编号连续的一段的书, 比如一个人可以复印 pages[0], pages[1], pages[2], 但是不可以只复印 pages[0], pages[2], pages[3] 而不复印 pages[1].所有人复印的速度是一样的, 复印一页需要花费一分钟, 并且所有人同时开始复印. 怎样分配这 k 个人的任务, 使得这 n 本书能够被尽快复印完?返回完成复印任务原创 2020-10-22 13:50:54 · 401 阅读 · 0 评论 -
583. 两个字符串的删除操作
583. 两个字符串的删除操作题目给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。示例:输入: “sea”, “eat”输出: 2解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"思路转化成最长公共子序列问题就可以了代码 public int minDistance(String word1, String word2) { int n = word1.l原创 2020-10-22 13:13:30 · 107 阅读 · 0 评论 -
300. 最长上升子序列 过
300. 最长上升子序列题目给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。思路代码 public int lengthOfLIS(int[] nums) { int n = nums.length; int f[] = new int[n+1]; if(n==0){ re原创 2020-10-22 13:09:53 · 77 阅读 · 0 评论 -
132. 分割回文串 II
132. 分割回文串 II题目给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回符合要求的最少分割次数。示例:输入: “aab”输出: 1解释: 进行一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。思路和完全平方数这个思路很像代码//判断字符串是否是回文 public boolean check(String t){ int n = t.length(); for(int i=0;i<n/2;i++原创 2020-10-22 13:04:42 · 94 阅读 · 0 评论 -
279. 完全平方数
279. 完全平方数题目给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.思路在具体实现的时候,有一个小技巧,具体见代码代码 public int numSquares(int n) { int f[] = new int[n+1]; f[0] = 0; f[1] = 1;原创 2020-10-22 13:00:44 · 83 阅读 · 0 评论 -
354. 俄罗斯套娃信封问题
354. 俄罗斯套娃信封问题题目给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4]原创 2020-10-22 11:24:07 · 76 阅读 · 0 评论 -
1143. 最长公共子序列 过
1143. 最长公共子序列题目给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。示例 1:输入:text1 = “abcd原创 2020-10-17 21:21:41 · 109 阅读 · 0 评论 -
515. 房屋染色 过
515. 房屋染色题目这里有n个房子在一列直线上,现在我们需要给房屋染色,分别有红色蓝色和绿色。每个房屋染不同的颜色费用也不同,你需要设计一种染色方案使得相邻的房屋颜色不同,并且费用最小,返回最小的费用。费用通过一个nx3 的矩阵给出,比如cost[0][0]表示房屋0染红色的费用,cost[1][2]表示房屋1染绿色的费用。样例 1:输入: [[14,2,11],[11,14,5],[14,3,10]]输出: 10解释: 第一个屋子染蓝色,第二个染绿色,第三个染蓝色,最小花费:2 + 5 +原创 2020-10-17 21:10:26 · 300 阅读 · 0 评论 -
198. 打家劫舍
198. 打家劫舍题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。思路用数原创 2020-10-17 20:51:00 · 66 阅读 · 0 评论 -
494. 目标和
494. 目标和题目给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例:输入:nums: [1, 1, 1, 1, 1], S: 3输出:5解释:-1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+1-1+1+1 = 3+1+1+1-1+1 = 3+1+1+1+1-1 = 3一共有5种方法原创 2020-10-14 23:35:06 · 87 阅读 · 0 评论 -
416. 分割等和子集
416. 分割等和子集题目给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].思路可以计算数组的和,然后除以2,判断数组中是否可以找到一些数,正好相加等于和的一半定义数据f[N][T]表示状态,其中f[i][j]表示前i数是否可以找出一些数据相加等于j,f是一个bo原创 2020-10-14 23:01:15 · 171 阅读 · 0 评论 -
474. 一和零
474. 一和零题目在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。示例 1:输入: strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3输出: 4解释: 总共 4 个字符串可以通过 5 个 0 和 3原创 2020-10-14 22:45:26 · 86 阅读 · 0 评论 -
01背包问题
01背包问题之间觉得这种DP基础题应该掌握的没问题,leetcode上也没找到这个题,后来在Acwing上做了一下,发现一遍过还是有问题,记录一下,留作复习。题目有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 viv_ivi,价值是 wiw_iwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 viv_原创 2020-10-14 22:08:35 · 98 阅读 · 0 评论