
动态规划
XIIV13
这个作者很懒,什么都没留下…
展开
-
LeetCode刷题笔记 面试题 17.13. 恢复空格
题目描述哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sen...原创 2020-03-31 22:46:16 · 710 阅读 · 0 评论 -
LeetCode刷题笔记 873. 最长的斐波那契子序列的长度 *
题目描述如果序列 X_1, X_2, …, X_n 满足下列条件,就说它是 斐波那契式 的:n >= 3对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。(回想一下,子序列是从原序列 A 中派生出来的,它从 A 中删掉任意数量的...原创 2020-03-07 03:05:49 · 212 阅读 · 0 评论 -
LeetCode刷题笔记 646. 最长数对链
题目描述给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。给定一个对数集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。示例 :输入: [[1,2], [2,3], [3,4]]...原创 2020-03-03 21:32:10 · 174 阅读 · 0 评论 -
LeetCode刷题笔记 1130. 叶值的最小代价生成树
题目描述给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:每个节点都有 0 个或是 2 个子节点。数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。(如果一个节点有 0 个子节点,那么该节点为叶节点。)每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。在所有这样的二叉树中,返回每个非叶节点的值的最小可能总和。这个和的值是一个 32 位整数。示例:输入:...原创 2020-03-03 18:51:46 · 244 阅读 · 0 评论 -
LeetCode刷题笔记 1140. 石子游戏 II
题目描述亚历克斯和李继续他们的石子游戏。许多堆石子 排成一行,每堆都有正整数颗石子 piles[i]。游戏以谁手中的石子最多来决出胜负。亚历克斯和李轮流进行,亚历克斯先开始。最初,M = 1。在每个玩家的回合中,该玩家可以拿走剩下的 前 X 堆的所有石子,其中 1 <= X <= 2M。然后,令 M = max(M, X)。游戏一直持续到所有石子都被拿走。假设亚历克斯和李都发...原创 2020-03-02 23:08:28 · 316 阅读 · 0 评论 -
Leetcode刷题笔记 121.买卖股票的最佳时间
总结上午思考了一会,总是想着用遍历数组的利润差值,然后用数组记录后比较。Stupid。网上搜了示例,才发现可以动态的记录最大利润,然后在循环中比较。最后:一定要考虑清楚基本的特殊情况。Demo codeclass Solution { public int maxProfit(int[] prices) { if (prices == null ||...原创 2019-09-18 23:24:08 · 166 阅读 · 0 评论 -
LeetCode刷题笔记 1049. 最后一块石头的重量 II
题目描述有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头...原创 2019-12-16 16:01:27 · 255 阅读 · 0 评论 -
LeetCode刷题笔记 838. 推多米诺
题目描述一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立。在开始时,我们同时把一些多米诺骨牌向左或向右推。每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。如果同时有多米诺骨牌落在一张垂直竖立的多米诺骨牌的两边,由于受力平衡, 该骨牌仍然保持不变。就这个问题而言,我们会认为正在下降的多米诺骨牌不会对其...原创 2019-12-15 22:54:13 · 463 阅读 · 0 评论 -
LeetCode刷题笔记 1191. K 次串联后最大子数组之和
题目描述给你一个整数数组 arr 和一个整数 k。首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次。举个例子,如果 arr = [1, 2] 且 k = 3,那么修改后的数组就是 [1, 2, 1, 2, 1, 2]。然后,请你返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是 0,在这种情况下它的总和也是 0。由于 结果可能会很大,所以需要 模(mod) 10...原创 2019-12-12 23:08:43 · 408 阅读 · 0 评论 -
LeetCode刷题笔记 813. 最大平均值和的分组
题目描述我们将给定的数组 A 分成 K 个相邻的非空子数组 ,我们的分数由每个子数组内的平均值的总和构成。计算我们所能得到的最大分数是多少。注意我们必须使用 A 数组中的每一个数进行分组,并且分数不一定需要是整数。示例:输入:A = [9,1,2,3,9]K = 3输出: 20解释:A 的最优分组是[9], [1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + ...原创 2019-12-10 21:28:40 · 168 阅读 · 0 评论 -
LeetCode刷题笔记 650. 只有两个键的键盘
题目描述最初在一个记事本上只有一个字符 ‘A’。你每次可以对这个记事本进行两种操作:Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。Paste (粘贴) : 你可以粘贴你上一次复制的字符。给定一个数字 n 。你需要使用最少的操作次数,在记事本中打印出恰好 n 个 ‘A’。输出能够打印出 n 个 ‘A’ 的最少操作次数。示例:输入: 3输...原创 2019-12-10 04:26:57 · 331 阅读 · 0 评论 -
LeetCode刷题笔记 983. 最低票价
题目描述在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限制的旅...原创 2019-12-10 03:42:00 · 168 阅读 · 0 评论 -
LeetCode刷题笔记 718. 最长重复子数组
题目描述给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3解释:长度最长的公共子数组是 [3, 2, 1]。Sample Code 1class Solution { public int findLength(int[] A, int[] B) { ...原创 2019-12-10 03:38:55 · 132 阅读 · 0 评论 -
LeetCode刷题笔记 516. 最长回文子序列
题目描述给定一个字符串s,找到其中最长的回文子序列。示例:输入:“bbbab”输出:4一个可能的最长回文子序列为 “bbbb”。Sample Code 1class Solution { public int longestPalindromeSubseq(String s) { int len = s.length(); int[][] ...原创 2019-12-09 12:29:23 · 176 阅读 · 0 评论 -
LeetCode刷题笔记 813. 最大平均值和的分组
题目描述我们将给定的数组 A 分成 K 个相邻的非空子数组 ,我们的分数由每个子数组内的平均值的总和构成。计算我们所能得到的最大分数是多少。注意我们必须使用 A 数组中的每一个数进行分组,并且分数不一定需要是整数。示例:输入:A = [9,1,2,3,9]K = 3输出: 20解释:A 的最优分组是[9], [1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + ...原创 2019-12-04 20:11:12 · 294 阅读 · 0 评论 -
LeetCode刷题笔记 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+...原创 2019-12-02 20:30:21 · 177 阅读 · 0 评论 -
LeetCode刷题笔记 486. 预测赢家
题目描述给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,……。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。示例:输入: [1, 5, 233, 7...原创 2019-12-02 20:27:00 · 174 阅读 · 0 评论 -
LeetCode刷题笔记 413. 等差数列划分
…原创 2019-11-19 10:58:51 · 249 阅读 · 0 评论 -
LeetCode刷题笔记 877. 石子游戏
题目描述亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ...原创 2019-10-21 22:43:54 · 184 阅读 · 0 评论 -
LeetCode刷题笔记 416. 分割等和子集
题目描述给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].总结SC其实也是动态规划Sample Codeclass Solution { public boolean canPartition(int[] nums) ...原创 2019-10-15 08:58:49 · 185 阅读 · 0 评论 -
LeetCode刷题笔记 375. 猜数字大小 II
题目描述我们正在玩一个猜数游戏,游戏规则如下:我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字。每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了。然而,当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。直到你猜到我选的数字,你才算赢得了这个游戏。示例:n = 10, 我选择了8.第一轮: 你猜我选择的数字是5,我会告诉你,我的数字更大一些,然后你需要支...原创 2019-10-14 17:20:06 · 629 阅读 · 0 评论 -
LeetCode刷题笔记 343. 整数拆分
记忆化搜索class Solution { private int[] memory; public int integerBreak(int n) { memory = new int[n + 1]; memory[0] = 0; memory[1] = 1; for (int i = 2; i < n + ...原创 2019-10-14 11:51:14 · 246 阅读 · 0 评论 -
LeetCode刷题笔记 二进制处理集合
平行算法求位1的个数public class Solution { public int hammingWeight(int n) { int temp = n; temp = (temp & 0x55555555) + ((temp>> 1) & 0x55555555); //temp相邻位相加 temp...原创 2019-10-12 15:32:37 · 212 阅读 · 0 评论 -
LeetCode刷题笔记 322. 零钱兑换*
题目描述给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例:输入: coins = [1, 2, 5], amount = 11输出: 3解释: 11 = 5 + 5 + 1(其他题目可能并不是 大值取尽量多 的策略)总结递归算法是「自顶向下」,动态规划叫做「自底向上...原创 2019-10-12 11:01:20 · 170 阅读 · 0 评论 -
LeetCode刷题笔记 股票问题集合:状态转移框架*
121. 买卖股票的最佳时机class Solution { public int maxProfit(int[] prices) { int n = prices.length; // base case: dp[-1][0] = 0, dp[-1][1] = -infinity int dp_i_0 = 0, dp_i_1 = Inte...原创 2019-10-12 09:04:00 · 220 阅读 · 0 评论 -
LeetCode刷题笔记 95. 不同的二叉搜索树 II *
题目描述给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。总结SDC1:递归SDC2:动态规划,同时还用了同构。值得注意的是,所有的左子树我们没有 clone ,也就是很多子树被共享了,在内存中就会是下边的样子。也就是左子树用的都是之前的子树,没有开辟新的空间。SDC3:动态规划仔细分析,可以发现一个规律。首先我们每次新增加的数字大于之前的所有数字,所以新增加的...原创 2019-10-03 17:38:25 · 240 阅读 · 0 评论 -
LeetCode刷题笔记 5214. 最长定差子序列
题目描述给你一个整数数组 arr 和一个整数 difference,请你找出 arr 中所有相邻元素之间的差等于给定 difference 的等差子序列,并返回其中最长的等差子序列的长度。示例:输入:arr = [1,5,7,8,5,3,4,2,1], difference = -2输出:4解释:最长的等差子序列是 [7,5,3,1]。总结淦,看了评论说map,但也没有想出来,没想到...原创 2019-10-06 12:39:55 · 265 阅读 · 0 评论 -
LeetCode刷题笔记 63. 不同路径 II
题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例:输入:[[0,0,0]...原创 2019-07-11 00:45:16 · 122 阅读 · 0 评论 -
LeetCode刷题笔记 62. 不同路径
题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向右 -> 向下向右 -&g...原创 2019-07-28 16:48:14 · 135 阅读 · 0 评论 -
LeetCode刷题笔记 64. 最小路径和
题目描述给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。总结仔细看看,动态规划经典题目SC通过递归与SDC相反,通过后面前面和通过前面求后面Sample C...原创 2019-08-02 04:32:33 · 109 阅读 · 0 评论 -
LeetCode刷题笔记 91. 解码方法
题目描述一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: “226”输出: 3解释: 它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。总结三段代码都用了相同的思路,递归,动态规划...原创 2019-09-13 10:41:06 · 194 阅读 · 0 评论 -
LeetCode刷题笔记 907. 子数组的最小值之和
题目描述给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组。由于答案可能很大,因此返回答案模 10^9 + 7。示例:输入:[3,1,2,4]输出:17解释:子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。最小值为 3,1,2,4,1,1,2,1,1,1,和...原创 2019-10-07 23:36:05 · 217 阅读 · 0 评论 -
LeetCode刷题笔记 120. 三角形最小路径和
题目描述给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。总结动态规划,思路相同SDC对数组操作比DC对List操作要快但DC用到的额外空间为O(0)DC2优化了就要快一丢丢了Sample ...原创 2019-08-02 04:24:25 · 171 阅读 · 0 评论 -
LeetCode刷题笔记 139. 单词拆分*
题目描述给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例:输入: s = “applepenapple”, wordDict = [“apple”, “pen”]输出: true解释: 返回 true 因为 “applepen...原创 2019-10-08 20:43:06 · 253 阅读 · 0 评论 -
LeetCode刷题笔记 221. 最大正方形
题目描述在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。示例:输入:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4总结SDC2的优化思路( i 应该换成 j )关于动态规划的题,如果遇到二维数组的题基本都可以优化为一维数组,就像是传给三秒后的自己的感觉。Sample & Demo Code ...原创 2019-10-10 15:08:58 · 236 阅读 · 0 评论 -
LeetCode刷题笔记 264. 丑数 II
题目描述编写一个程序,找出第 n 个丑数。丑数就是只包含质因数 2, 3, 5 的正整数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。总结咚咚咚咚咚咚态规划,这题让我来想估计想到index++那里会用比较大小的方式(逃…),有时候做的题多了反而思维更死板了。Sample & Demo Co...原创 2019-10-10 15:49:34 · 140 阅读 · 0 评论 -
LeetCode刷题笔记 5. 最长回文子串*
题目描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”总结SDC1:Manacher’s 算法详解SDC2:从中心拓展的思路,分为从 i 和 i 开始比较 和从 i 和 i+1 开始比较,区分奇数回文和...原创 2019-09-13 15:32:28 · 276 阅读 · 0 评论