![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode-动态规划
KobeSacre
这个作者很懒,什么都没留下…
展开
-
判断子序列
类似, 只是当两个字符不同时取值逻辑有变化。原创 2023-09-05 11:03:35 · 438 阅读 · 0 评论 -
股票的最大利润
leetcode原创 2022-11-29 10:25:06 · 72 阅读 · 0 评论 -
圆圈中最后剩下的数字
leetcode原创 2022-11-28 20:40:53 · 95 阅读 · 0 评论 -
n个骰子的点数
leetcode原创 2022-11-22 16:49:25 · 134 阅读 · 0 评论 -
丑数
leetcode原创 2022-10-10 10:31:41 · 354 阅读 · 0 评论 -
礼物的最大价值
leetcode原创 2022-10-09 16:06:50 · 70 阅读 · 0 评论 -
把数字翻译成字符串
leetcode原创 2022-10-09 14:50:41 · 95 阅读 · 0 评论 -
剪绳子
解题思路:用dp解决, dp数组存储 1 -> n - 1的最优解即可求出 n 的最优解。原创 2022-09-06 10:33:09 · 91 阅读 · 0 评论 -
前 n 个数字二进制中 1 的个数
前 n 个数字二进制中 1 的个数题目:给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。示例 1:输入: n = 2输出: [0,1,1]解释: 0 --> 01 --> 12 --> 10示例 2:输入: n = 5输出: [0,1,1,2,1,2]解释:0 --> 01 --> 12 --> 103 --> 114 --> 1005 --> 101c原创 2022-02-07 14:36:01 · 97 阅读 · 0 评论 -
连续子数组的最大和
leetcode原创 2021-07-07 11:18:07 · 85 阅读 · 0 评论 -
最小路径和
最小路径和题目:给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例 1:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。示例 2:输入:grid = [[1,2,3],[4,5,6]]输出:12解题思路:...原创 2020-11-17 14:20:19 · 74 阅读 · 0 评论 -
比特位计数
比特位计数题目:给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]解题思路1:分别求出每个数的 二进制中1的个数class Solution { public int[] countBits(int n) { int[] ans = new int[n + 1]; for原创 2021-06-29 17:22:27 · 71 阅读 · 0 评论 -
最佳买卖股票时机含冷冻期
最佳买卖股票时机含冷冻期题目:给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]class Solution { public原创 2021-06-28 21:55:04 · 76 阅读 · 0 评论 -
最大正方形
最大正方形题目:在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。示例 1:输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]输出:4示例 2:输入:matrix = [[“0”,“1”],[“1”,“0”]]输出:1示例 3:输入:matrix = [[“0”]]输出:0class原创 2021-06-28 16:51:57 · 57 阅读 · 0 评论 -
单词拆分
单词拆分题目:给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。示例 2:输入: s = “applepenapple”, word原创 2021-06-28 15:26:50 · 57 阅读 · 0 评论 -
不同的二叉搜索树
不同的二叉搜索树题目:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。示例 1:输入:n = 3输出:5示例 2:输入:n = 1输出:1解题思路:运用动态规划解决class Solution { public int numTrees(int n) { // dp[i]表示有 i 个节点时组成的二叉树个数 int dp[] = new int[n + 1];原创 2021-06-22 15:47:06 · 53 阅读 · 0 评论 -
目标和
目标和题目:给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。示例 1:输入:nums = [1,1,1,1,1], target = 3输出:5解释:一共有 5 种方法让最终目标原创 2021-06-11 17:09:29 · 125 阅读 · 0 评论 -
打家劫舍 III
打家劫舍 III题目:在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \原创 2021-06-10 15:13:16 · 65 阅读 · 0 评论 -
最长有效括号
最长有效括号题目:给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例 1:输入:s = “(()”输出:2解释:最长有效括号子串是 “()”示例 2:输入:s = “)()())”输出:4解释:最长有效括号子串是 “()()”示例 3:输入:s = “”输出:0解题思路:用动态规划进行解决class Solution { public int longestValidParentheses(String s) {原创 2021-06-01 16:55:10 · 63 阅读 · 0 评论 -
回文子串
回文子串题目:给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:“abc”输出:3解释:三个回文子串: “a”, “b”, “c”示例 2:输入:“aaa”输出:6解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”解题思路1:用动态规划解决,记录每个子串是否是回文即可class Solution { public int countS原创 2021-05-29 16:01:50 · 64 阅读 · 0 评论 -
接雨水
接雨水题目:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。解题思路1: 运用动态规划分别记录左右两边的最大高度,然后依次计算即可class Solution { public int trap(int[] height) { if(height.length == 0)原创 2021-03-19 11:43:38 · 95 阅读 · 0 评论 -
除自身以外数组的乘积
除自身以外数组的乘积题目:给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。解题思路:可以用两个数组来分别记录从左到当前下标的乘积和从右原创 2021-03-04 11:21:51 · 91 阅读 · 1 评论 -
不同的子序列
不同的子序列题目:给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)题目数据保证答案符合 32 位带符号整数范围。示例 1:输入:s = “rabbbit”, t = “rabbit”输出:3示例 2:输入:s = “babgbag”, t = “bag”输出:5解题思路:首先从s原创 2021-01-08 11:19:06 · 247 阅读 · 0 评论 -
编辑距离
编辑距离题目:给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)示例 2:输入:word1 = “i原创 2021-01-07 11:54:57 · 81 阅读 · 0 评论 -
交错字符串
交错字符串题目:给定三个字符串 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 和原创 2021-01-05 14:27:21 · 134 阅读 · 2 评论 -
使用最小花费爬楼梯
使用最小花费爬楼梯题目:数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。示例 1:输入: cost = [10, 15, 20]输出: 15解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。示例 2:输入: cost = [1, 100, 1,原创 2020-12-21 09:22:58 · 96 阅读 · 0 评论 -
买卖股票的最佳时机含手续费
买卖股票的最佳时机含手续费题目:给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。示例 1:输入: prices = [1, 3, 2, 8, 4, 9], fee = 2输出: 8解释: 能够原创 2020-12-17 11:05:06 · 100 阅读 · 0 评论 -
戳气球
戳气球题目:有 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-01 00:20:53 · 86 阅读 · 0 评论 -
背包问题 II
背包问题 II题目:有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.问最多能装入背包的总价值是多大?样例样例 1:输入: m = 10, A = [2, 3, 5, 7], V = [1, 5, 2, 4]输出: 9解释: 装入 A[1] 和 A[3] 可以得到最大价值, V[1] + V[3] = 9样例 2:输入: m = 10, A = [2, 3, 8], V = [2, 5, 8]输出: 10解释: 装入 A[0]原创 2020-11-26 16:11:50 · 65 阅读 · 0 评论 -
组合总和 IV
组合总和 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]样例2输入: nums = [1, 2] 和 target = 4输出: 5解释:可能的所有组合有:[1, 1, 1, 1][1, 1, 2]原创 2020-11-26 14:55:38 · 131 阅读 · 0 评论 -
背包问题 V
背包问题 V题目:给出 n 个物品, 以及一个数组, nums[i] 代表第i个物品的大小, 保证大小均为正数, 正整数 target 表示背包的大小, 找到能填满背包的方案数。每一个物品只能使用一次样例给出候选物品集合 [1,2,3,3,7] 以及 target 7结果的集合为:[7][1,3,3]返回 2解题思路:和背包问题类似,只是将可行性变成了方案数public class Solution { /** * @param nums: an integer ar原创 2020-11-25 17:08:42 · 115 阅读 · 0 评论 -
背包问题
背包问题题目:在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]样例样例 1:输入: [3,4,8,5], backpack size=10输出: 9样例 2:输入: [2,3,5,7], backpack size=12输出: 12解题思路:从最后一个物品开始思考,如果前n - 1个物品可以拼出m那么前n个物品必然可以拼出m,此时不需要装入最后一个物品;如果前n - 1个物品不能拼出m,那么装入最后一个物品判断是否可以拼出m。同样,判断原创 2020-11-25 15:58:30 · 164 阅读 · 0 评论 -
硬币排成线
硬币排成线题目:有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。请判定 先手玩家 必胜还是必败?若必胜, 返回 true, 否则返回 false.样例样例 1:输入: 1输出: true样例 2:输入: 4输出: true解释:先手玩家第一轮拿走一个硬币, 此时还剩三个.这时无论后手玩家拿一个还是两个, 下一次先手玩家都可以把剩下的硬币拿完.解题思路:博弈型动态规划,首先从只剩一枚硬币开始思考,只有一枚硬币原创 2020-11-25 14:51:14 · 193 阅读 · 0 评论 -
书籍复印
书籍复印题目:给定 n 本书, 第 i 本书的页数为 pages[i]. 现在有 k 个人来复印这些书籍, 而每个人只能复印编号连续的一段的书, 比如一个人可以复印 pages[0], pages[1], pages[2], 但是不可以只复印 pages[0], pages[2], pages[3] 而不复印 pages[1].所有人复印的速度是一样的, 复印一页需要花费一分钟, 并且所有人同时开始复印. 怎样分配这 k 个人的任务, 使得这 n 本书能够被尽快复印完?返回完成复印任务最少需要的分钟原创 2020-11-25 11:39:33 · 185 阅读 · 0 评论 -
分割回文串 II
分割回文串 II题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回符合要求的最少分割次数。示例:输入: “aab”输出: 1解释: 进行一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。解题思路:首先创建一个数组存储i到j是否是回文串,之后再用动态规划进行最少分割次数的求解class Solution { public int minCut(String s) { if(s == null)原创 2020-11-23 16:26:02 · 248 阅读 · 0 评论 -
完全平方数
完全平方数题目:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.解题思路:首先思考组成最后一个数字(n)的完全平方数个数,发现n的完全平方数个数是由组成(n - 完全平方数)+1得到的,以此类推是一个重复子问题class Solution { p原创 2020-11-23 15:13:27 · 470 阅读 · 0 评论 -
俄罗斯套娃信封问题
俄罗斯套娃信封问题题目:给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4]解题思原创 2020-11-23 11:12:57 · 113 阅读 · 0 评论 -
最长上升子序列
最长上升子序列题目:给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。class Solution { public int lengthOfLIS(int[] nums) { int n = nums.length; if(n == 0) return 0;原创 2020-11-20 16:48:21 · 75 阅读 · 0 评论 -
买卖股票的最佳时机 II
买卖股票的最佳时机 II题目:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买原创 2020-11-18 16:28:45 · 136 阅读 · 0 评论 -
买卖股票的最佳时机
买卖股票的最佳时机题目:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票原创 2020-11-18 15:41:47 · 91 阅读 · 0 评论