
动态规划系列
文章平均质量分 88
动态规划系列面试题目
硕风和炜
硕风和炜,优快云官方Java领域优质创作者,阿里云社区专家博主,华为云云享专家,第十二届蓝桥杯JavaB组省1,保研,国家奖学金,JAVA开发技术栈,面试刷题,面经八股文,经验分享,好用的网站工具分享
展开
-
【LeetCode:132. 分割回文串 II + 动态规划】
【LeetCode:132. 分割回文串 II + 动态规划】给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。返回符合要求的 最少分割次数 。原创 2025-03-02 14:34:36 · 660 阅读 · 0 评论 -
【LeetCode: LCR 126. 斐波那契数 + 动态规划】
【LeetCode: LCR 126. 斐波那契数 + 动态规划】斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给定 n ,请计算 F(n) 。原创 2025-02-18 15:33:54 · 782 阅读 · 0 评论 -
【LeetCode: 887. 鸡蛋掉落 + 递归 + 二分 + dp】
【LeetCode: 887. 鸡蛋掉落 + 递归 + 二分 + dp】给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。请你计原创 2025-02-06 11:12:09 · 591 阅读 · 0 评论 -
【LeetCode: 104. 二叉树的最大深度 + 二叉树 + 递归】
【LeetCode: 104. 二叉树的最大深度 + 二叉树 + 递归】给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。原创 2025-01-04 11:22:10 · 456 阅读 · 0 评论 -
【LeetCode: 376. 摆动序列 + 动态规划】
【LeetCode: 376. 摆动序列 + 动态规划】如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数原创 2025-01-01 19:41:48 · 953 阅读 · 0 评论 -
【LeetCode: 845. 数组中的最长山脉 + 动态规划】
【LeetCode: 845. 数组中的最长山脉 + 动态规划】给出一个整数数组 arr,返回最长山脉子数组的长度。如果不存在山脉子数组,返回 0 。原创 2024-12-24 12:06:35 · 889 阅读 · 0 评论 -
【LeetCode:91. 解码方法 + 递归 + 记忆化搜索 + 动态规划】
【LeetCode:91. 解码方法 + 递归 + 记忆化搜索 + 动态规划】一条包含字母 A-Z 的消息通过以下映射进行了 编码 :然而,在 解码 已编码的消息时,你意识到有许多不同的方式来解码,因为有些编码被包含在其它编码当中("2" 和 "5" 与 "25")。例如,"11106" 可以映射为:"AAJF" ,将消息分组为 (1, 1, 10, 6)"KJF" ,将消息分组为 (原创 2024-10-20 16:38:15 · 1064 阅读 · 0 评论 -
【LeetCode: 119. 杨辉三角 II | 动态规划】
【LeetCode: 119. 杨辉三角 II | 动态规划】给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。原创 2024-10-14 20:50:38 · 407 阅读 · 0 评论 -
【LeetCode: 118. 杨辉三角 | 动态规划】
【LeetCode: 118. 杨辉三角 | 动态规划】给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。原创 2024-10-13 17:38:17 · 489 阅读 · 0 评论 -
【Leetcode:LCR 101. 分割等和子集 + 递归 + 记忆化搜索 + dp】
【Leetcode:LCR 101. 分割等和子集 + 递归 + 记忆化搜索 + dp】给定一个非空的正整数数组 nums ,请判断能否将这些数字分成元素和相等的两部分。原创 2024-09-07 17:52:15 · 1171 阅读 · 0 评论 -
【牛客:最长公共子串 + 递归 + 缓存 + 动态规划】
【牛客:最长公共子串 + 递归 + 缓存 + 动态规划】给定两个字符串str1和str2,输出两个字符串的最长公共子串题目保证str1和str2的最长公共子串存在且唯一。原创 2024-08-18 18:54:22 · 771 阅读 · 0 评论 -
【LeetCode:1035. 不相交的线 + 动态规划】
【LeetCode:1035. 不相交的线 + 动态规划】最长公共子序列在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足: nums1[i] == nums2[j]且绘制的直线不与任何其他连线(非水平线)相交。请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。原创 2024-08-11 16:00:24 · 1430 阅读 · 0 评论 -
【LeetCode: 600. 不含连续1的非负整数 | 暴力递归=>记忆化搜索=>动态规划 | 数位dp】
【LeetCode: 600. 不含连续1的非负整数 | 暴力递归=>记忆化搜索=>动态规划 | 数位dp】原创 2024-08-05 10:28:59 · 617 阅读 · 0 评论 -
【LeetCode:3098. 求出所有子序列的能量和 + 记忆化缓存】
【LeetCode:3098. 求出所有子序列的能量和 + 记忆化缓存】给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。一个 子序列 的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。请你返回 nums 中长度 等于 k 的 所有 子序列的 能量和 。由于答案可能会很大,将答案对 109 + 7 取余 后返回。原创 2024-07-23 12:33:59 · 1206 阅读 · 0 评论 -
【LeetCode:494. 目标和 + 递归】
【LeetCode:494. 目标和 + 递归】给你一个非负整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。原创 2024-06-30 17:13:05 · 1288 阅读 · 0 评论 -
【LeetCode:2742. 给墙壁刷油漆 + 递归 + 记忆化搜索 + dp】
【LeetCode:2742. 给墙壁刷油漆 + 递归 + 记忆化搜索 + dp】给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time ,分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠:- 一位需要 付费 的油漆匠,刷第 i 堵墙需要花费 time[i] 单位的时间,开销为 cost[i] 单位的钱。- 一位 免费 的油漆匠,刷 任意 一堵墙的时间为 1 单位,开销为 0 。但是必须在付费油漆匠 工作 时,免费油漆匠才会工作。请你返回刷完 n 堵墙最少开销为多少原创 2024-06-28 15:45:06 · 1040 阅读 · 0 评论 -
【LeetCode:2741. 特别的排列 + 递归 + 记忆化搜索 + 动态规划】
【LeetCode:2741. 特别的排列 + 递归 + 记忆化搜索 + 动态规划】给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数。如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列:对于 0原创 2024-06-26 10:56:10 · 963 阅读 · 0 评论 -
【LeetCode:2786. 访问数组中的位置使分数最大 + 递归 + 记忆化缓存 + dp】
【LeetCode:2786. 访问数组中的位置使分数最大 + 递归 + 记忆化缓存 + dp】给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。你 一开始 在数组的位置 0 处,你可以按照下述规则访问数组中的其他位置:如果你当前在位置 i ,那么你可以移动到满足 i < j 的 任意 位置 j 。对于你访问的位置 i ,你可以获得分数 nums[i] 。如果你从位置 i 移动到位置 j 且 nums[i] 和 nums[j] 的 奇偶性 不同,那么你将失去分数 x 。请你返回原创 2024-06-14 10:53:00 · 709 阅读 · 0 评论 -
【LeetCode:312. 戳气球+ 动态规划】
【LeetCode:312. 戳气球+ 动态规划】有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。求所能获得硬币的最大数量。原创 2024-06-09 11:10:07 · 1417 阅读 · 0 评论 -
【LeetCode:3040. 相同分数的最大操作数目 II + 缓存】
【LeetCode:3040. 相同分数的最大操作数目 II + 缓存】给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个:选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一个元素并且删除它们。一次操作的 分数 是被删除元素的和。在确保 所有操作分数相同 的前提下,请你求出 最多 能进行多少次操作。请你返回按照上述要求 最多 可以进行的操作次数。原创 2024-06-08 10:57:29 · 783 阅读 · 0 评论 -
【LeetCode:1235. 规划兼职工作 + 动态规划 + 二分查找】
【LeetCode:1235. 规划兼职工作 + 动态规划 + 二分查找】你打算利用空闲时间来做兼职工作赚些零花钱。这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 profit[i]。给你一份兼职工作表,包含开始时间 startTime,结束时间 endTime 和预计报酬 profit 三个数组,请你计算并返回可以获得的最大报酬。注意,时间上出现重叠的 2 份工作不能同时进行。如果你选择的工作在时间 X 结束,那么你可以立刻进行原创 2024-05-04 13:52:56 · 1116 阅读 · 1 评论 -
【LeetCode: 3117. 划分数组得到最小的值之和 + 动态规划】
【LeetCode: 3117. 划分数组得到最小的值之和 + 动态规划】给你两个数组 nums 和 andValues,长度分别为 n 和 m。数组的 值 等于该数组的 最后一个 元素。你需要将 nums 划分为 m 个 不相交的连续 子数组,对于第 ith 个子数组 [li, ri],子数组元素的按位AND运算结果等于 andValues[i],换句话说,对所有的 1原创 2024-04-15 21:56:09 · 1245 阅读 · 0 评论 -
【LeetCode: 96. 不同的二叉搜索树 + 动态规划】
【LeetCode: 96. 不同的二叉搜索树 + 动态规划】给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。原创 2024-04-02 22:50:34 · 457 阅读 · 0 评论 -
【Acwing: 3508. 最长公共子串 + 动态规划】
【Acwing: 3508. 最长公共子串 + 动态规划】给定两个字符串,求这两个字符串的不包含数字的最长公共子串的长度。输入格式共两行,每行一个由小写字母和数字构成的字符串。输出格式一个整数,表示给定两个字符串的不包含数字的最长公共子串的长度。如果不存在满足要求的非空公共子串,则输出 0原创 2024-03-25 21:28:15 · 393 阅读 · 0 评论 -
【LeetCode: 120. 三角形最小路径和 + 动态规划】
【LeetCode: 120. 三角形最小路径和 + 动态规划】给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。原创 2024-03-23 20:44:48 · 908 阅读 · 0 评论 -
【LeetCode:746. 使用最小花费爬楼梯 | 递归 -> 记忆化搜索 -> DP】
【LeetCode:746. 使用最小花费爬楼梯 | 递归 -> 记忆化搜索 -> DP】给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。原创 2023-12-17 11:14:17 · 155 阅读 · 0 评论 -
【LeetCode:70. 爬楼梯 | 递归 -> 记忆化搜索 -> DP】
【LeetCode:70. 爬楼梯 | 递归 -> 记忆化搜索 -> DP】假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?原创 2023-12-10 09:43:10 · 188 阅读 · 0 评论 -
【LeetCode:689. 三个无重叠子数组的最大和 | 序列dp+前缀和】
【LeetCode:689. 三个无重叠子数组的最大和 | 序列dp+前缀和】给你一个整数数组 nums 和一个整数 k ,找出三个长度为 k 、互不重叠、且全部数字和(3 * k 项)最大的子数组,并返回这三个子数组。以下标的数组形式返回结果,数组中的每一项分别指示每个子数组的起始位置(下标从 0 开始)。如果有多个结果,返回字典序最小的一个。原创 2023-11-20 10:38:25 · 176 阅读 · 0 评论 -
【LeetCode:1155. 掷骰子等于目标和的方法数 | 递归->缓存->dp】
【LeetCode:1155. 掷骰子等于目标和的方法数 | 递归->缓存->dp】这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k 。给定三个整数 n , k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面朝上的数字之和等于 target 。答案可能很大,你需要对 109 + 7 取模 。原创 2023-10-24 12:37:03 · 650 阅读 · 0 评论 -
【LeetCode:1402. 做菜顺序 | 动态规划 + 贪心】
【LeetCode:1402. 做菜顺序 | 动态规划 + 贪心】一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间(包含之前每道菜所花费的时间)乘以这道菜的满意程度,也就是 time[i]*satisfaction[i] 。返回厨师在准备了一定数量的菜肴后可以获得的最大 like-time 系数 总和。你可以按 任意 顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得原创 2023-10-22 15:09:07 · 434 阅读 · 0 评论 -
【LeetCode: 918. 环形子数组的最大和 | 动态规划】
918. 环形子数组的最大和,给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i + 1], ..., nums[j] ,原创 2023-10-06 10:12:06 · 252 阅读 · 0 评论 -
【LeetCode: 931. 下降路径最小和 | 暴力递归=>记忆化搜索=>动态规划 】
LeetCode: 931. 下降路径最小和 | 暴力递归=>记忆化搜索=>动态规划 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (ro原创 2023-07-13 10:15:21 · 572 阅读 · 1 评论 -
【LeetCode: 1911. 最大子序列交替和 | 暴力递归=>记忆化搜索=>动态规划 】
LeetCode: 1911. 最大子序列交替和 | 暴力递归=>记忆化搜索=>动态规划 。一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。比方说,数组 [4,2,5,3] 的交替和为 (4 + 5) - (2 + 3) = 4 。给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从 0 开始编号)。一个数组的 子序列 是从原数组中删除一些元素后(也可能一个也不删除)剩余元素不改变顺序组成的数组。原创 2023-07-12 09:54:03 · 395 阅读 · 0 评论 -
【LeetCode: 486. 预测赢家 | 暴力递归=>记忆化搜索=>动态规划 】
【LeetCode: 486. 预测赢家 | 暴力递归=>记忆化搜索=>动态规划 】🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] 或 nums[nums.length - 1]),取到的数原创 2023-05-30 11:29:22 · 613 阅读 · 4 评论 -
【LeetCode: 410. 分割数组的最大值 | 暴力递归=>记忆化搜索=>动态规划 】
【LeetCode: 410. 分割数组的最大值 | 暴力递归=>记忆化搜索=>动态规划 】🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。作者简介:硕风和炜,优快云-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享原创 2023-05-24 11:03:19 · 849 阅读 · 14 评论 -
【LeetCode: 面试题 17.24. 最大子矩阵 | 动态规划 】
【LeetCode: 面试题 17.24. 最大子矩阵 | 动态规划 】给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀原创 2023-05-23 09:00:23 · 702 阅读 · 19 评论 -
【LeetCode: 10. 正则表达式匹配 | 暴力递归=>记忆化搜索=>动态规划 】
【LeetCode: 10. 正则表达式匹配 | 暴力递归=>记忆化搜索=>动态规划 】给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨原创 2023-05-21 13:00:41 · 623 阅读 · 2 评论 -
【LeetCode: 44. 通配符匹配 | 暴力递归=>记忆化搜索=>动态规划 】
【LeetCode: 44. 通配符匹配 | 暴力递归=>记忆化搜索=>动态规划 】给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 '?' 和 '*' 匹配规则的通配符匹配:'?' 可以匹配任何单个字符。'*' 可以匹配任意字符序列(包括空字符序列)。判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨🌲原创 2023-05-20 16:32:09 · 973 阅读 · 8 评论 -
【LeetCode: 343. 整数拆分 | 暴力递归=>记忆化搜索=>动态规划 】
【LeetCode: 343. 整数拆分 | 暴力递归=>记忆化搜索=>动态规划 】给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨🌲 作者简介:硕风和炜,优快云-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎原创 2023-05-18 10:43:40 · 835 阅读 · 8 评论 -
【LeetCode: 1335. 工作计划的最低难度 | 暴力递归=>记忆化搜索=>动态规划 】
【LeetCode: 1335. 工作计划的最低难度 | 暴力递归=>记忆化搜索=>动态规划 】🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0原创 2023-05-17 08:21:46 · 604 阅读 · 10 评论