动态规划
算法的leecode
free1993
这个作者很懒,什么都没留下…
展开
-
2021-06-22
题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路典型的dp代码class Solution {public: int translateNum(int num) { string str = to_string(num); int n = str.size();原创 2021-06-22 20:27:47 · 45 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组
题目给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。思路用两个dp数组记录,第一个dp记录从头的连乘,第二个dp记录从后面的连乘。代码class Solution {public: vector<int> constructArr(vector<int>& a)原创 2021-06-21 15:13:15 · 58 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列
题目写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。代码const int mod = 1e9 + 7;class Solutio原创 2021-03-22 14:05:31 · 42 阅读 · 0 评论 -
n个骰子的点数
题目把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例一输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]思路这道题目是使用dp来统计总体的次数然后统计结束之后,计算概率代码class Solution {public: vector<doubl原创 2021-03-17 12:01:15 · 52 阅读 · 0 评论 -
连续子数组的最大和
题目输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。思路要求遍历一次就找到最大的数值。时刻比较与当前和的值,如果当前数值小于1,证明对后面的和没有什么贡献,将其置0.代码class Solution {public: int maxSubArray(vector<int>& nums) { int maxn = -0x3f3f3f3f, curSum = 0; fo原创 2021-03-16 12:47:57 · 39 阅读 · 0 评论 -
leecode.1771. 由子序列构造的最长回文串的长度
题目给你两个字符串 word1 和 word2 ,请你按下述方法构造一个字符串:从 word1 中选出某个 非空 子序列 subsequence1 。从 word2 中选出某个 非空 子序列 subsequence2 。连接两个子序列 subsequence1 + subsequence2 ,得到字符串。返回可按上述方法构造的最长 回文串 的 长度 。如果无法构造回文串,返回 0 。字符串 s 的一个 子序列 是通过从 s 中删除一些(也可能不删除)字符而不更改其余字符的顺序生成的字符串。原创 2021-03-01 18:55:39 · 123 阅读 · 0 评论 -
leecode1770. 执行乘法运算的最大分数
思路使用dp[i][j]表示针对数组nums,数组头取i个数字,数组尾取j个数字。实际上说是按照1来计数,但是数组还是从0开始访问的。也就是说当访问multipliers的下标为i的时候,表示目前应该已经删除i+1个数字了;当multipliers的下标为i的时候,因为删除i+1个,所以无论是从队首还是队尾,有i+1种情况。倘若此时访问队首的下标为j的时候,表示目前准备删除的数字是nums[j],此时删除了数字的个数应该是j+1个(因为数组还是从0开始访问的)。假设当时前面的下标为j的时候,表示删原创 2021-03-01 17:01:35 · 75 阅读 · 1 评论 -
leeode.5690. 最接近目标价格的甜点成本
题目你打算做甜点,现在需要购买配料。目前共有 n 种冰激凌基料和 m 种配料可供选购。而制作甜点需要遵循以下几条规则:必须选择 一种 冰激凌基料。可以添加 一种或多种 配料,也可以不添加任何配料。每种类型的配料 最多两份 。给你以下三个输入:baseCosts ,一个长度为 n 的整数数组,其中每个 baseCosts[i] 表示第 i 种冰激凌基料的价格。toppingCosts,一个长度为 m 的整数数组,其中每个 toppingCosts[i] 表示 一份 第 i 种冰激凌配料的价格。原创 2021-02-28 13:57:29 · 177 阅读 · 0 评论 -
leecode.152. 乘积最大子数组
题目给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例一输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。思路分析因为存在负数,所以我们需要维护当前的最大值和最小值。代码class Solution {public: int maxProduct(vector<int>& nums) { int n = nums.size(), a原创 2021-02-27 19:34:07 · 69 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
题目在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例一输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物提示:0 < grid.length <= 2000 < grid[0].length &原创 2021-01-20 18:36:23 · 41 阅读 · 0 评论 -
leecode.10.正则表达式匹配
题目给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例一输入:s = “aa” p = “a”输出:false解释:“a” 无法匹配 “aa” 整个字符串。思路分析令dp[i][j]表示是否匹配成功。为了防止越界,我们分别在每个字符串前面加了一个哨兵。在匹配的过程中,如果s[i] == p[j],表示当前两个字符相原创 2021-01-06 16:06:11 · 82 阅读 · 0 评论 -
leecode.32. 最长有效括号
题目给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例一输入: “(()”输出: 2解释: 最长有效括号子串为 “()”思路分析令dp[i]表示以i结尾的字符串匹配的括号的最长的长度。如果当此时的字符串是’)'的时候,如果前一个字符串是左括号,那么此时匹配成功,此时dp[i]=dp[i-2]+1。这就意味着我们每次都是选择最近的左括号进行匹配。如果此时前一个字符串是右括号,那么如果能匹配成功,必然是前一个右括号已经全部匹配结束,找其匹配的前一个位置,例原创 2021-01-04 14:13:57 · 64 阅读 · 0 评论 -
300. 最长递增子序列
题目给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。思路分析使用传统的dp操作用dp[i]表示下标从[0,…,i]的LCS的长度。代码class Solution {public: int lengthOfLIS(vector<int>& nums) { int n =原创 2020-12-29 07:47:29 · 68 阅读 · 0 评论 -
leecode.312. 戳气球
题目有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。求所能获得硬币的最大数量。说明:你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实存原创 2020-12-28 18:49:32 · 52 阅读 · 0 评论 -
leecode.72. 编辑距离
题目给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例一输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)思路分析我们使用dp[i][j]来表示长度为[0,…原创 2020-12-28 18:03:14 · 59 阅读 · 0 评论 -
leecode.188. 买卖股票的最佳时机 IV
题目给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例一输入:k = 2, prices = [2,4,1]输出:2解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。示例二输入:k = 2, pri原创 2020-12-28 17:12:40 · 88 阅读 · 0 评论 -
leecode.123. 买卖股票的最佳时机 III
题目给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例一输入: [3,3,5,0,0,3,1,4]输出: 6解释: 在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时原创 2020-12-28 16:25:17 · 62 阅读 · 0 评论 -
leecode.1223. 掷骰子模拟
题目掷骰子模拟有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号)。现在,给你一个整数数组 rollMax 和一个整数 n,请你来计算掷 n 次骰子可得到的不同点数序列的数量。假如两个序列中至少存在一个元素不同,就认为这两个序列是不同的。由于答案可能很大,所以请返回 模 10^9 + 7 之后的结果。示例输入:n = 2, rollMax = [1,1,2原创 2020-12-23 16:06:12 · 869 阅读 · 0 评论 -
leecode.740. 删除与获得点数
题目给定一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。示例输入: nums = [2, 2, 3, 3, 3, 4]输出: 9解释:删除 3 来获得 3 个点数,接着要删除两个 2 和 4 。之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。原创 2020-12-22 19:01:22 · 59 阅读 · 0 评论 -
leecode.801. 使序列递增的最小交换次数
题目我们有两个长度相等且不为空的整型数组 A 和 B 。我们可以交换 A[i] 和 B[i] 的元素。注意这两个元素在各自的序列中应该处于相同的位置。在交换过一些元素之后,数组 A 和 B 都应该是严格递增的(数组严格递增的条件仅为A[0] < A[1] < A[2] < … < A[A.length - 1])。给定数组 A 和 B ,请返回使得两个数组均保持严格递增状态的最小交换次数。假设给定的输入总是有效的。示例示例:输入: A = [1,3,5,4], B =原创 2020-12-22 18:37:59 · 105 阅读 · 0 评论 -
leecode.1039. 多边形三角剖分的最低得分
题目多边形三角剖分的最低得分给定 N,想象一个凸 N 边多边形,其顶点按顺时针顺序依次标记为 A[0], A[i], …, A[N-1]。假设您将多边形剖分为 N-2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 N-2 个三角形的值之和。返回多边形进行三角剖分后可以得到的最低分。示例二输入:[3,7,4,5]输出:144解释:有两种三角剖分,可能得分分别为:375 + 457 = 245,或 345 + 347 = 144。最低分数为 144。原创 2020-12-22 15:59:49 · 94 阅读 · 0 评论 -
leecode.931. 下降路径最小和
题目下降路径最小和给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和。下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。示例输入:[[1,2,3],[4,5,6],[7,8,9]]输出:12解释:可能的下降路径有:[1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9][2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,原创 2020-12-21 17:41:34 · 95 阅读 · 0 评论 -
leecode.1130. 叶值的最小代价生成树
题目 叶值的最小代价生成树给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:每个节点都有 0 个或是 2 个子节点。数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。(知识回顾:如果一个节点有 0 个子节点,那么该节点为叶节点。)每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。在所有这样的二叉树中,返回每个非叶节点的值的最小可能总和。这个和的值是一个 32 位整数。输入:arr = [6,2,4]输出:32解释:有两种可能的树,第一种的非叶节点的总和为 36原创 2020-12-21 17:27:57 · 102 阅读 · 0 评论 -
leecode.983. 最低票价
题目在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第原创 2020-12-21 16:42:57 · 76 阅读 · 0 评论 -
leecode.712. 两个字符串的最小ASCII删除和
题目给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和。两个字符串的最小ASCII删除和示例输入: s1 = “sea”, s2 = “eat”输出: 231解释: 在 “sea” 中删除 “s” 并将 “s” 的值(115)加入总和。在 “eat” 中删除 “t” 并将 116 加入总和。结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。思路一分析取数组dp[i][j]表示S1[0, …, i - 1]和S2[0, …, j原创 2020-12-21 16:16:21 · 163 阅读 · 0 评论 -
leecode.746.使用最小花费爬楼梯
题目使用最小花费爬楼梯数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。示例输入: cost = [10, 15, 20]输出: 15解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。思路使用dp做,每个台阶的转移状态有两种,前一个台阶或者前两原创 2020-12-21 15:41:55 · 89 阅读 · 0 评论 -
leecode.799. 香槟塔
题目香槟塔我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟。从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任何溢出的香槟都会立刻等流量的流向左右两侧的玻璃杯。当左右两边的杯子也满了,就会等流量的流向它们左右两边的杯子,依次类推。(当最底层的玻璃杯满了,香槟会流到地板上)例如,在倾倒一杯香槟后,最顶层的玻璃杯满了。倾倒了两杯香槟后,第二层的两个玻璃杯各自盛放一半的香槟。在倒三杯香槟后,第二层的香槟满了 - 此时总共有原创 2020-12-19 14:04:38 · 233 阅读 · 1 评论 -
leecode.面试题.08.11.硬币
题目硬币。给定数量不限的硬币,币值为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代码class Solution {public: con原创 2020-12-19 12:53:27 · 77 阅读 · 1 评论 -
leecode.1510.石子游戏四
题目石子游戏四Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。如果石子堆里没有石子了,则无法操作的玩家输掉游戏。给你正整数 n ,且已知两个人都采取最优策略。如果 Alice 会赢得比赛,那么返回 True ,否则返回 False 。示例输入:n = 7输出:false解释:当 Bob 采取最优策略时,Alice 无法赢得比赛。如果 Alice 一开始拿走 4 个原创 2020-12-14 15:53:37 · 554 阅读 · 1 评论 -
leecode.1406.石子游戏3
题目Alice 和 Bob 用几堆石子在做游戏。几堆石子排成一行,每堆石子都对应一个得分,由数组 stoneValue 给出。Alice 和 Bob 轮流取石子,Alice 总是先开始。在每个玩家的回合中,该玩家可以拿走剩下石子中的的前 1、2 或 3 堆石子 。比赛一直持续到所有石头都被拿走。每个玩家的最终得分为他所拿到的每堆石子的对应得分之和。每个玩家的初始分数都是 0 。比赛的目标是决出最高分,得分最高的选手将会赢得比赛,比赛也可能会出现平局。假设 Alice 和 Bob 都采取 最优策略 。原创 2020-12-14 15:24:03 · 214 阅读 · 0 评论 -
leecode.1140.石子游戏2
题目石子游戏2亚历克斯和李继续他们的石子游戏。许多堆石子 排成一行,每堆都有正整数颗石子 piles[i]。游戏以谁手中的石子最多来决出胜负。亚历克斯和李轮流进行,亚历克斯先开始。最初,M = 1。在每个玩家的回合中,该玩家可以拿走剩下的 前 X 堆的所有石子,其中 1 <= X <= 2M。然后,令 M = max(M, X)。游戏一直持续到所有石子都被拿走。假设亚历克斯和李都发挥出最佳水平,返回亚历克斯可以得到的最大数量的石头。示例输入:piles = [2,7,9,4,4]原创 2020-12-14 11:09:38 · 118 阅读 · 0 评论 -
leecode.877.石子游戏
题目石子游戏亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。示例输入:[5,3,4,5]输出:true解释:亚历克斯先开原创 2020-12-14 09:02:47 · 69 阅读 · 0 评论 -
leecode.62.不同路径
题目不同路径思路分析动态DP,位置为(m,n)只能从(m-1,n)和(m,n-1)来。因此状态转移方程dp[m][n] = dp[m-1][n] + dp[m][n - 1].代码class Solution {public: int uniquePaths(int m, int n) { vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); for(int i原创 2020-12-09 12:05:40 · 54 阅读 · 0 评论