
动态规划
文章平均质量分 55
DP
NLP_victor
这个作者很懒,什么都没留下…
展开
-
数组-LeetCode2016. 增量元素之间的最大差值
1、题目描述力扣链接给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。返回 最大差值 。如果不存在满足要求的 i 和 j ,返回 -1 。2、代码详解举一反三DP、贪心-LeetCode121. 买卖股票的最佳时机(k = 1)public class maximumDifference2016 {原创 2022-02-26 19:09:09 · 474 阅读 · 0 评论 -
LeetCode978. 最长湍流子数组(动态规划)
1、题目描述https://leetcode-cn.com/problems/longest-turbulent-subarray/当 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为奇数时,...原创 2021-02-08 23:40:23 · 382 阅读 · 2 评论 -
DP-LeetCode376. 摆动序列
1、题目描述https://leetcode-cn.com/problems/wiggle-subsequence/如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如,[1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3)是正负交替出现的。 相反, [1,4,7,2,5]和[1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序...原创 2020-12-13 16:08:44 · 153 阅读 · 0 评论 -
LeetCode1024. 视频拼接(贪心、DP)
1、题目描述https://leetcode-cn.com/problems/video-stitching/你将会获得一系列视频片段,这些片段来自于一项持续时长为T秒的体育赛事。这些片段可能有所重叠,也可能长度不一。视频片段clips[i]都用区间进行表示:开始于clips[i][0]并于clips[i][1]结束。我们甚至可以对这些片段自由地再剪辑,例如片段[0, 7]可以剪切成[0, 1] +[1, 3] + [3, 7]三部分。我们需要将这些片段进行再剪辑,...原创 2020-10-24 19:48:12 · 511 阅读 · 0 评论 -
LeetCode416. 分割等和子集(0−1背包问题)
1、题目详解https://leetcode-cn.com/problems/partition-equal-subset-sum/给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。每个数组中的元素不会超过 100 数组的大小不会超过 2002、代码详解空间复杂度是O(n×target),时间复杂度是O(n×target)空间优化题解:https://leetcode-cn.com/problems/partition-equal-.原创 2020-10-11 23:37:20 · 237 阅读 · 0 评论 -
背包问题系列
1、背包问题https://www.jiuzhang.com/solutions/backpack/#tag-lang-python在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]输入: [3,4,8,5], backpack size=10, 输出: 9输入: [2,3,5,7], backpack size=12, 输出: 12用dp[i][j]表示能否用前i个物品拼出重量j (TRUE / FALSE)class S...原创 2020-08-29 21:12:30 · 270 阅读 · 0 评论 -
DP-LeetCode546. 移除盒子(困难题:消消乐)
1、题目描述https://leetcode-cn.com/problems/remove-boxes/给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。 你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >= 1),这样一轮之后你将得到 k*k 个积分。 当你将所有盒子都去掉之后,求你能获得的最大积分和。输入:boxes = [1,3,2,2,2,3,4,3,1]输出:23解释:[1, 3, 2,原创 2020-08-16 00:27:03 · 562 阅读 · 0 评论 -
DP-LeetCode221. 最大正方形
1、题目描述https://leetcode-cn.com/problems/maximal-square/在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。2、代码详解class Solution(object): def maximalSquare(self, matrix): if not matrix: return 0 res = 0 # 记录结果 # 定义d.原创 2020-07-29 22:50:53 · 174 阅读 · 0 评论 -
DP-LeetCode312. 戳气球
1、题目描述https://leetcode-cn.com/problems/burst-balloons/有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组nums中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得nums[left] * nums[i] * nums[right]个硬币。这里的left和right代表和i相邻的两个气球的序号。注意当你戳破了气球 i 后,气球left和气球right就变成了相邻的气球。...原创 2020-07-19 20:32:59 · 179 阅读 · 0 评论 -
DP-LeetCode174. 地下城游戏
1、题目描述https://leetcode-cn.com/problems/dungeon-game/一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。(血量要大于等于1)有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失.原创 2020-07-12 22:31:13 · 160 阅读 · 0 评论 -
DP-LeetCode714. 买卖股票的最佳时机含手续费
1、题目描述(k = +infinity with fee)https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/给定一个整数数组prices,其中第i个元素代表了第i天的股票价格 ;非负整数fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。...原创 2020-07-10 23:10:03 · 240 阅读 · 0 评论 -
DP-LeetCode309. 最佳买卖股票时机含冷冻期(122. II)
1、题目描述(k = +infinity with cooldown)https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/基础题:122. 买卖股票的最佳时机 II (贪心)(买卖任意多次,但任意时刻最多持有一股,k = +infinity)https://blog.youkuaiyun.com/IOT_victor/article/details/105742167给定一个整数数组,其中第i个元素..原创 2020-07-10 17:19:11 · 190 阅读 · 0 评论 -
DP-LeetCode139. 单词拆分
1、题目描述https://leetcode-cn.com/problems/word-break/给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。2、代码详解动态规划class Solution(object): def wordBreak(self, s, wordDict): """ .原创 2020-07-09 11:45:20 · 199 阅读 · 0 评论 -
DP-LeetCode32. 最长有效括号
1、题目描述https://leetcode-cn.com/problems/longest-valid-parentheses/给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。2、代码详解情况2s[i]== ′ ) ′ 这时,需要看其前面对元素来判断是否有有效括号对。情况2.1情况2.2 : 特殊case)()(()))class Solution(object): def longestValidP...原创 2020-07-04 11:44:25 · 185 阅读 · 0 评论 -
DP-LeetCode96. 不同的二叉搜索树
1、题目描述https://leetcode-cn.com/problems/unique-binary-search-trees/给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?2、代码详解动态规划卡特兰数 公式https://baike.baidu.com/item/卡特兰数G(n)=G(0)∗G(n−1)+G(1)∗G(n−2)+...+G(n−1)∗G(0)class Solution(object): def numTre.原创 2020-07-01 16:34:09 · 272 阅读 · 0 评论 -
DP、哈希表、二分查找-718. 最长重复子数组
1、题目描述https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3 解释: 长度最长的公共子数组是 [3, 2, 1]。2、代码详解dp初始化问题:dp实际是存储最大公共子串的默认值的数组,初始化为0,因为假设都是不存在重复子串嘛! 越界问题:但是原创 2020-07-01 10:38:55 · 217 阅读 · 0 评论 -
二分、划分型DP-书籍印刷 · Copy Books
1、题目描述书籍复印 · Copy Bookshttps://www.jiuzhang.com/problem/copy-books/https://www.jiuzhang.com/problem/copy-books/#tag-highlight给定n本书, 第i本书的页数为pages[i]. 现在有k个人来复印这些书籍, 而每个人只能复印编号连续的一段的书,比如一个人可以复印pages[0], pages[1], pages[2], 但是不可以只复印pages[0]...原创 2020-06-30 12:18:05 · 400 阅读 · 0 评论 -
DP-LeetCode132. 分割回文串 II
1、题目描述给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回符合要求的最少分割次数。输入: "aab"输出: 1解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。2、代码详解class Solution(object): def minCut(self, s): """ :type s: str :rtype: int """ n = le.原创 2020-06-28 23:09:55 · 219 阅读 · 0 评论 -
DP-279. 完全平方数
1、题目描述给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。输入: n = 12输出: 3 解释: 12 = 4 + 4 + 4.输入: n = 13输出: 2解释: 13 = 4 + 9.2、代码详解时间复杂度:O(n*sqrt(n)),sqrt为平方根class Solution(object): def numSquares(self, n): """原创 2020-06-28 11:28:10 · 223 阅读 · 0 评论 -
DP-LeetCode44. 通配符匹配(任意字符串包括空)
1、题目描述'?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。https://leetcode-cn.com/problems/wildcard-matching/2、代码详解class Solution(object): def isMatch(self, s, p): """ '?' 可以匹配任何单个字符 '*' 可以匹配任意字符串(包括空字符串) """原创 2020-06-23 19:50:00 · 503 阅读 · 0 评论 -
DP-LeetCode10. 正则表达式匹配(零个或多个前面的那个元素)
1、题目描述https://leetcode-cn.com/problems/regular-expression-matching/2、代码详解class Solution: def isMatch(self, s, p): m = len(s) # text n = len(p) # pattern dp = [[False for i in range(0, n + 1)] for j in range(原创 2020-06-23 18:59:02 · 484 阅读 · 0 评论 -
DP-LeetCode188. 买卖股票的最佳时机 IV(k 任意数, 思路II+III)
1、题目描述(k任意数, 思路II+III)给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。2、储备题k任意数, 思路II+III122. 买卖股票的最佳时机 II (通用解法)(k = +infinity)https://blog.youkuaiyun.com/IOT_victor/article/details/105742167...原创 2020-06-22 17:01:01 · 251 阅读 · 0 评论 -
DP-LeetCode265. 粉刷房子 II
1、题目描述同类题:LeetCode256. 粉刷房子https://blog.youkuaiyun.com/IOT_victor/article/details/106365741(序列型)假如有一排房子,共n个,每个房子可以被粉刷成k种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个nxk的矩阵来表示的。例如,costs[0][0]表示第...原创 2020-06-20 20:34:48 · 327 阅读 · 0 评论 -
DP-LeetCode361. 轰炸敌人
1、题目描述给你一个二维的网格图,网格图中的每一个格子里要么是一堵墙 'W' ,要么是一个敌人 'E' ,要么是一个空位 '0' (数字 0 ),返回你用一个炸弹最多能杀死敌人的数量。由于墙体足够坚硬,炸弹的威慑力没有办法穿越墙体,所以炸弹只能把所在位置同一行和同一列所有没被墙挡住的敌人给炸死。注意:你只能把炸弹放在一个空的格子里2、代码详解class Solution: def maxKilledEnemies(self, grid): # ini原创 2020-06-17 21:36:36 · 375 阅读 · 0 评论 -
DP-LeetCode72. 编辑距离
1、题目描述给你两个单词word1和word2,请你计算出将word1转换成word2所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符 删除一个字符 替换一个字符2、代码详解自底向上class Solution: def minDistance(self, word1: str, word2: str) -> int: n1 = len(word1) n2 = len(word2) ...原创 2020-06-10 16:59:31 · 260 阅读 · 0 评论 -
DP-LeetCode64. 最小路径和
1、题目描述https://leetcode-cn.com/problems/minimum-path-sum/给定一个包含非负整数的mxn网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。相似题:DP-LeetCode62.不同路径https://blog.youkuaiyun.com/IOT_victor/article/details/1063338352、代码详解class Solution(object): d...原创 2020-05-28 13:00:03 · 256 阅读 · 0 评论 -
DP-LeetCode674. 最长连续递增序列Longest Continuous Increasing Subsequence
1、题目描述https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/关键词:连续给定一个未经排序的整数数组,找到最长且连续的的递增序列。相似题:DP、二分-LeetCode300. 最长上升子序列LIS(可以不是连续的)https://blog.youkuaiyun.com/IOT_victor/article/details/1054732562、代码详解class Solution(obj原创 2020-05-27 22:37:16 · 183 阅读 · 0 评论 -
DP-LeetCode91. 解码方法
1、题目描述2、代码详解O(n)class Solution(object): def numDecodings(self, s): """ :type s: str :rtype: int """ # 空串时,或字符串以 '0' 开头(非法), 则直接返回0 if s == '' or s[0] == '0': return 0 n =原创 2020-05-27 18:21:03 · 216 阅读 · 0 评论 -
DP-LeetCode256. 粉刷房子
1、题目描述https://www.lintcode.com/problem/paint-house/description注意:所有花费均为正整数。输入: [[17,2,17],[16,16,5],[14,3,19]]输出: 10解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。最少花费: 2 + 5 + 3 = 10。2、代码详解转移方程初始条件和边界情况计算顺序class Solution(object):原创 2020-05-26 21:46:04 · 356 阅读 · 0 评论 -
DP-LeetCode63. 不同路径 II
1、题目描述https://leetcode-cn.com/problems/unique-paths-ii/网格中的障碍物和空位置分别用 1 和 0 来表示。输入:[[0,0,0],[0,1,0],[0,0,0]]输出: 2解释:3x3 网格的正中间有一个障碍物。从左上角到右下角一共有 2 条不同的路径:1. 向右 -> 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右 -> 向右2、代码详解关联题目:DP-Le...原创 2020-05-26 15:54:41 · 245 阅读 · 0 评论 -
DP、贪心-LeetCode55. 跳跃游戏
1、题目描述给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。2、代码详解法一:巧妙,greedy如果一个位置能够到达,那么这个位置左侧所有位置都能到达。(因为跳的长度可以任意,只要小于最大长度)解题思路:如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。.原创 2020-05-25 16:58:25 · 345 阅读 · 0 评论 -
DP-LeetCode62. 不同路径
1、题目描述https://leetcode-cn.com/problems/unique-paths/2、代码详解转移方程初始条件和边界情况计算顺序class Solution(object): def uniquePaths(self, m, n): dp = [[1]*n for _ in range(m)] # m * n for i in range(m): for j in range(n原创 2020-05-25 15:20:54 · 279 阅读 · 0 评论 -
DP-LeetCode516. 最长回文子序列(Python)
1、题目描述给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。2、代码详解类似题升级版本,子序列可以跳字符相关题: LeetCode5. 最长回文子串(双指针、中心扩展算法)https://blog.youkuaiyun.com/IOT_victor/article/details/105961369class Solution(object): ...原创 2020-05-06 23:09:32 · 303 阅读 · 0 评论 -
DP-LeetCode123. 买卖股票的最佳时机 III(k = 2)
1、题目描述2、代码详解DP-LeetCode121. 买卖股票的最佳时机DP-LeetCode122. 买卖股票的最佳时机 II'''for (int k = max_k; k >= 1; k--) { if (i - 1 == -1) { /*处理 base case */ } dp[i][k][0] = max(dp[i-1][k][0], d...原创 2020-04-25 23:36:59 · 342 阅读 · 0 评论 -
DP、贪心-LeetCode122. 买卖股票的最佳时机 II(k = +infinity)
1、题目描述给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。2、代码详解同类型题DP-LeetCode121. 买卖股票的最佳时机class Solution(object):...原创 2020-04-24 23:28:35 · 291 阅读 · 0 评论 -
DP、贪心-LeetCode121. 买卖股票的最佳时机(k = 1)
1、题目描述给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。(不能在买入股票前卖出股票)如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。2、通用模板2.1、状态每天都有三种「选择」:买入、卖出、无操作。用 buy, sell, rest 表示这三种选择。sell 必须在 buy 之后,buy 必须在 ...原创 2020-04-23 22:59:53 · 326 阅读 · 0 评论 -
DP-LeetCode337. 打家劫舍 III
1、题目描述在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。2、代码详解...原创 2020-04-22 22:48:32 · 232 阅读 · 0 评论 -
DP-LeetCode213. 打家劫舍 II
1、题目描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。2、代码详解class So...原创 2020-04-21 23:11:19 · 205 阅读 · 0 评论 -
DP-LeetCode198. 打家劫舍
1、题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。2、代码详解class Solution(object): def ...原创 2020-04-20 23:20:35 · 268 阅读 · 0 评论 -
DP、二分优化-LeetCode354. 俄罗斯套娃信封问题(隐晦的LIS)(Python)
1、题目描述给定一些标记了宽度和高度的信封,宽度和高度以整数对形式(w, h)出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明: 不允许旋转信封。2、代码详解相似题DP、二分-LeetCode300. 最长上升子序列...原创 2020-04-18 22:34:27 · 552 阅读 · 0 评论