动态规划
该专栏主要是一些关于动态规划的题解
jump_into_zehe
这个作者很懒,什么都没留下…
展开
-
生成平衡数组的方案数
LeetCode 1664生成平衡数组的方案数给你一个整数数组nums。你需要选择 恰好 一个下标(下标从 0 开始)并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。比方说,如果 nums = [6,1,7,4,1],那么:选择删除下标 1 ,剩下的数组为nums = [6,7,4,1]。选择删除下标 2 ,剩下的数组为nums = [6,1,4,1]。选择删除下标 4 ,剩下的数组为nums = [6,1,7,4]。如果一个数组满足奇数下标元素的和与偶数下标元素的和原创 2020-12-15 16:27:59 · 239 阅读 · 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+1+1-1+1+1 = 3+1+1+1-1+1 = 3+1+1+1+1-1 = 3原创 2020-12-04 15:51:42 · 166 阅读 · 0 评论 -
最后一块石头的重量
LeetCode 1049最后一块石头的重量有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。示例:输入:[2,7,4,1,8,1]输原创 2020-11-24 19:24:07 · 141 阅读 · 0 评论 -
1262、可被三整除的最大和(扩展、可被k整除的最大和)
LeetCode 1262可被三整除的最大和给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。示例 1:输入:nums = [3,6,5,1,8]输出:18解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。示例 2:输入:nums = [4]输出:0解释:4 不能被 3 整除,所以无法选出数字,返回 0。示例 3:输入:nums = [1,2,3,4,4]输出:12解释:选出数字 1, 3, 4 以及 4,它们的和是 12(原创 2020-11-08 12:10:37 · 433 阅读 · 0 评论 -
467、环绕字符串中唯一的子字符串
LeetCode 467环绕字符串中唯一的子字符串把字符串s看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 s 中 p 的不同的非空子串的数目。注意: p 仅由小写的英文字母原创 2020-11-07 11:17:27 · 264 阅读 · 0 评论 -
1641,统计字典序元音字符串的数目
LeetCode 1641统计字典序元音字符串的数目给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。示例 1:输入:n = 1输出:5解释:仅由元音组成的 5 个字典序字符串为 ["a","e","i","o","u"]示例 2:输入:n = 2输出:15解释:仅由元音组成的 15原创 2020-11-06 13:38:47 · 167 阅读 · 0 评论 -
剑指Offer 63. 股票的最大利润
股票的最大利润剑指Offer 63假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0原创 2020-10-18 11:01:49 · 216 阅读 · 0 评论 -
填充书架
leetCode 1105填充书架附近的家居城促销,你买回了一直心仪的可调节书架,打算把自己的书都整理到新的书架上。你把要摆放的书books都整理好,叠成一摞:从上往下,第i本书的厚度为books[i][0],高度为books[i][1]。按顺序将这些书摆放到总宽度为 shelf_width 的书架上。先选几本书放在书架上(它们的厚度之和小于等于书架的宽度shelf_width),然后再建一层书架。重复这个过程,直到把所有的书都放在书架上。需要注意的是,在上述过程的每个步骤中,摆放书的顺序与你整原创 2020-10-06 12:18:56 · 232 阅读 · 0 评论 -
650,只有两个键的键盘
LeetCode 650只有两个键的键盘最初在一个记事本上只有一个字符 ‘A’。你每次可以对这个记事本进行两种操作:Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。Paste(粘贴) : 你可以粘贴你上一次复制的字符。给定一个数字n。你需要使用最少的操作次数,在记事本中打印出恰好n个 'A'。输出能够打印出n个'A'的最少操作次数。示例 1:输入: 3输出: 3解释:最初, 我们只有一个字符 'A'。第 1 步, 我们使用 Copy A原创 2020-10-05 12:35:33 · 96 阅读 · 0 评论 -
357,计算各个位数不同的数字个数
LeetCode 357计算各个位数不同的数字个数给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。示例:输入: 2输出: 91 解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。解法:动态规划解题思路:其实一个二位数就是由一位数后面加一位组成的如:一位数:0 1 2 3 4 5 6 7 8 9二位数:10 11 12 13 14 15 16 17 18 1原创 2020-10-04 13:07:24 · 394 阅读 · 0 评论 -
1314.矩阵区域和
LeetCode 1314矩阵区域和给你一个 m * n的矩阵mat和一个整数K,请你返回一个矩阵 answer ,其中每个answer[i][j]是所有满足下述条件的元素mat[r][c]的和:i - K <= r <= i + K, j - K <= c <= j + K(r, c) 在矩阵内。示例 1:输入:mat = [[1,2,3],[4,5,6],[7,8,9]], K = 1输出:[[12,21,16],[27,45,33],[24,39,28]]原创 2020-10-03 20:47:10 · 261 阅读 · 0 评论 -
837,新21点
LeetCode 837新21点爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?示例 1:输入:N = 10, K = 1, W = 10输出:1.00000说明:爱丽丝得到一张卡,然后停止。示原创 2020-10-02 12:21:58 · 87 阅读 · 0 评论 -
K站中转内最便宜的航班
LeetCode 787K站中转内便宜的航班有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -1。示例 1:输入: n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]src = 0, dst = 2, k = 1输出: 200解释: 城市航班原创 2020-09-14 22:43:51 · 474 阅读 · 0 评论 -
一和零
LeetCode 474一和零在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。注意:给定 0 和 1 的数量都不会超过 100。给定字符串数组的长度不会超过 600。示例 1:输入: Array = {"10", "0001", "111001", "1"原创 2020-09-08 17:55:28 · 820 阅读 · 0 评论 -
比特位计数
LeetCode 338比特币计数给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]进阶:给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?要求算法的空间复杂度为O(n)。你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置原创 2020-08-11 20:14:36 · 120 阅读 · 0 评论 -
最长递增子序列的个数
LeetCode 673最长递增子序列的个数给定一个未排序的整数数组,找到最长递增子序列的个数。示例 1:输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。、示例 2:输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。解法1:动态规划解题思路:首先,最长子序列的长度我们可以用动态规划的思想来解决定义dp数组为以nums[i]为结尾原创 2020-08-11 19:26:16 · 637 阅读 · 0 评论 -
乘积最大子数组
LeetCode 152乘积最大子数组给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。解法1:动态规划解题思路:用动态规划的思想,dp数组的含义就是从第i个数字到第j个数字的乘积和有以下原创 2020-08-09 13:08:30 · 115 阅读 · 0 评论 -
最长上升子序列
LeetCode 300最长上升子序列给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?解法: 动态规划解题思路:因为要求最长的子序列,所以我们可以用动态规划的思想我们定原创 2020-08-04 21:22:27 · 119 阅读 · 0 评论 -
元素和小于等于阈值的正方形的最大边长
LeetCode 1292元素和小于等于阈值的正方形的最大边长给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold。请你返回元素总和小于或等于阈值的正方形区域的最大边长;如果没有这样的正方形区域,则返回 0 。示例1:输入:mat = [[1,1,3,2,4,3,2],[1,1,3,2,4,3,2],[1,1,3,2,4,3,2]], threshold = 4输出:2解释:总和小于 4 的正方形的最大边长为 2,如图所示。解法1:动态规划解题思路:可以用动原创 2020-08-04 15:30:29 · 200 阅读 · 0 评论 -
戳气球
LeetCode 312戳气球有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 原创 2020-08-02 23:30:16 · 142 阅读 · 0 评论 -
为运算表达式设计优先级
LeetCode 241为运算表达式设计优先级给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。示例 1:输入: "2-1-1"输出: [0, 2]解释: ((2-1)-1) = 0 (2-(1-1)) = 2示例 2:输入: "2*3-4*5"输出: [-34, -14, -10, -10, 10]解释: (2*(3-(4*5))) = -34 ((2*3)-(4*5原创 2020-08-02 20:53:26 · 499 阅读 · 0 评论 -
最长端流子数组--动态规划
leetcode 978最长端流子数组当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组:若i <= k < j,当k为奇数时,A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];或 若i <= k < j,当k为偶数时,A[k] > A[k+1] ,且当k为奇数时,A[k] < A[k+1]。也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流原创 2020-06-27 14:03:09 · 171 阅读 · 0 评论 -
剑指Offer 14 -Ⅱ.剪绳子--动态规划
剑指Offer 14-Ⅱ剪绳子题目描述:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m] 。请问 k[0]* k[1] *…*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入: 2输出: 1解释:原创 2020-06-25 17:10:28 · 132 阅读 · 0 评论 -
K次串联后最大子数组之和--动态规划
LeetCode 1191K次串联后最大子数组之和题目描述:给你一个整数数组 arr 和一个整数 k。首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次。举个例子,如果 arr = [1, 2] 且 k = 3,那么修改后的数组就是 [1, 2, 1, 2, 1, 2]。然后,请你返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是 0,在这种情况下它的总和也是 0。由于 结果可能会很大,所以需要 模(mod) 10^9 + 7 后再返回。示例1:输入:arr = [原创 2020-06-18 15:17:06 · 283 阅读 · 0 评论 -
背包九讲笔记--多重背包问题(内附代码实现)
背包九讲–多重背包问题前言:最近在看背包九讲,记一下笔记顺便将其中的代码实现一下这个多重背包的问题较好理解,完全背包问题是物品不限次的拿,而多重背包问题是物品有限次的拿,因此当物品的重量乘以物品的个数大于总背包重量时,相当于完全背包问题,否则就通过01背包问题来解决代码实现:01背包问题实现public class PackageProblem01 { public void PackageProblem02Solution(int[] dp, int C, int W, int we原创 2020-06-16 20:43:44 · 595 阅读 · 0 评论 -
背包九讲笔记--背包问题(内附代码实现)
背包九讲(一)前言:最近在看背包九讲,将自己的理解给记录下来基本思路那里,可以理解为将这个背包问题简化成是否要放下第i件物品,放下第i件物品就要重背包中取出重量等同的物品关于优化空间优化前dp[][]数组的值代码import java.util.Arrays;public class PackageProblem { public static void main(String[] args) { int value[] = {0,3,7,8,1};原创 2020-06-14 20:46:49 · 187 阅读 · 0 评论 -
最大的以1为边界的正方形--动态规划
leetcode 1139最大的以1为边界的正方形题目描述:给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。示例1:输入:grid = [[1,1,1],[1,0,1],[1,1,1]]输出:9示例2:输入:grid = [[1,1,0,0]]输出:1解法:动态规划解题思路: 取一个点dp[i][j],以dp[i][j]为右下角的正方形,我们对dp[i][j]保存两个值,一个原创 2020-06-12 13:19:31 · 210 阅读 · 0 评论 -
零钱兑换--动态规划
Leetcode 323零钱兑换题目描述:给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例1:输入: coins = [1, 2, 5], amount = 11输出: 3 解释: 11 = 5 + 5 + 1示例2:输入: coins = [2], amount = 3输出: -1解法一:穷举法解题思路: 每一种硬币种类的组合都求出来,当它满足和等于a原创 2020-06-10 12:07:02 · 497 阅读 · 0 评论 -
匹配子序列--动态规划
leetcode 392判断子序列题目描述:给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例1:s ="abc", t = "ahbgdc"返回true示例2:s原创 2020-06-05 13:23:37 · 1027 阅读 · 0 评论 -
面试题,硬币--动态规划
Leetcode 面试题硬币题目描述:给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)示例1:输入: n = 5输出:2解释: 有两种方式可以凑成总金额:5=55=1+1+1+1+1示例2:输入: n = 10输出:4解释: 有四种方式可以凑成总金额:10=1010=5+510=5+1+1+1+1+110=1+1+1+1+1+1+1+1+1+1解法:动态规划思路:看到这道题我们原创 2020-06-04 22:45:19 · 255 阅读 · 0 评论 -
删除与获得点数--动态规划
Leetcode 740删除与获得点数题目描述:给定一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。示例1:输入: nums = [3, 4, 2]输出: 6解释: 删除 4 来获得 4 个点数,因此 3 也被删除。之后,删除 2 来获得 2 个点数。总共获得原创 2020-06-03 17:45:27 · 159 阅读 · 0 评论 -
不同的搜索二叉树个数--动态规划
leetcode 96不同的二叉搜索树个数题目描述:给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \原创 2020-05-27 12:14:19 · 1228 阅读 · 0 评论 -
统计全为1的正方形子矩阵--动态规划
leetcode 1277统计全为1的正方形子矩阵给你一个m*n的矩阵,矩阵中的元素不是0就是1,请你统计并返回其中完全由1组成的正方形子矩阵的个数示例 1:输入:matrix =[ [0,1,1,1], [1,1,1,1], [0,1,1,1]]输出:15解释: 边长为 1 的正方形有 10 个。边长为 2 的正方形有 4 个。边长为 3 的正方形有 1 个。正方形的总数 = 10 + 4 + 1 = 15.示例2:输入:matrix = [[1,0,1],原创 2020-05-26 16:32:05 · 747 阅读 · 0 评论 -
最长回文子串--动态规划
leetcode 5最长回文子串题目描述:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例2:输入: "cbbd"输出: "bb"解法1:动态规划思路:一个回文子串的左右两边再加上两个相同的字符同样是一个回文子串,当长度为1时,本身为回文串,当长度为2时,两个字符相同则为回文串我们用一个二维数组来表示一个子串是否为回文串P(i,j) = 0 //非回原创 2020-05-25 17:41:19 · 1025 阅读 · 0 评论 -
至少有一位重复数字--动态规划
leetcode 1012至少有一位重复的数字题目描述:给定正整数 N,返回小于等于 N 且具有至少 1 位重复数字的正整数的个数。示例1:输入:20输出:1解释:具有至少 1 位重复数字的正数(<= 20)只有 11 。示例2:输入:100输出:10解释:具有至少 1 位重复数字的正数(<= 100)有 11,22,33,44,55,66,77,88,99 和 100 。示例3:输入:1000输出:262提示:1 <= N <=10^9思路原创 2020-05-23 20:24:26 · 501 阅读 · 0 评论