
动态规划
文章平均质量分 55
文艺范ya
慢慢来吧,谁都有努力的过程
展开
-
LeetCode——368. 最大整除子集
题目描述:给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:answer[i] % answer[j] == 0 或 answer[j] % answer[i] == 0。如果存在多个有效解子集,返回其中任何一个均可。示例 1:输入:nums = [1,2,3]输出:[1,2]解释:[1,3] 也会被视为正确答案。示例 2:输入:nums = [1,2,4原创 2021-04-23 14:59:44 · 151 阅读 · 0 评论 -
LeetCode——213. 打家劫舍 II
题目描述:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他原创 2021-04-15 11:46:14 · 148 阅读 · 0 评论 -
LeetCode——931. 下降路径最小和
题目描述:给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。示例 1:输入:matrix = [[原创 2021-04-10 18:59:32 · 333 阅读 · 0 评论 -
LeetCode——1277. 统计全为 1 的正方形子矩阵
题目描述:给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。提示:1 <= arr.length <= 3001 <= arr[0].length <= 3000 <= arr[i][j] <= 1示例 1:输入:matrix =[ [0,1,1,1], [1,1,1,1], [0,1,1,1]]输出:15解释:边长为 1 的正方形有 10 个。边长为 2原创 2021-03-26 16:59:15 · 179 阅读 · 0 评论 -
LeetCode——1641. 统计字典序元音字符串的数目
题目描述:给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。提示:1 <= n <= 50示例 1:输入:n = 1输出:5解释:仅由元音组成的 5 个字典序字符串为 [“a”,“e”,“i”,“o”,“u”]示例 2:输入:n = 2输出:15解释:仅由元音组成的 1原创 2021-03-25 13:04:38 · 187 阅读 · 0 评论 -
LeetCode——1769. 移动所有球到每个盒子所需的最小操作数
题目描述:有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的,而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。在一步操作中,你可以将 一个 小球从某个盒子移动到一个与之相邻的盒子中。第 i 个盒子和第 j 个盒子相邻需满足 abs(i - j) == 1 。注意,操作执行后,某些盒子中可能会存在不止一个小球。返回一个长度为 n 的数组 answer ,其中 answer[i] 是将所有小球移动到第 i原创 2021-03-11 17:29:12 · 272 阅读 · 0 评论 -
LeetCode——剑指 Offer 47. 礼物的最大价值
题目描述:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?提示:0 < grid.length <= 2000 < grid[0].length <= 200示例 1:输入:[ [1,3,1], [1,5,1], [4,2,1]。]输出: 12解释: 路原创 2021-03-11 14:59:46 · 111 阅读 · 0 评论 -
LeetCode——516. 最长回文子序列
题目描述:给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。提示:1 <= s.length <= 1000s 只包含小写英文字母示例 1:输入:“bbbab”输出:4一个可能的最长回文子序列为 “bbbb”。示例 2:输入:“cbbd”输出:2一个可能的最长回文子序列为 “bb”。解题思路:状态 f[i][j] 表示 s 的第 i 个字符到第 j 个字符组成的子串中,最长的回文序列长度是多少原创 2021-01-30 15:04:35 · 281 阅读 · 0 评论 -
LeetCode——354. 俄罗斯套娃信封问题
题目描述:给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]原创 2020-12-25 11:29:30 · 314 阅读 · 0 评论 -
LeetCode——面试题 08.01. 三步问题
题目描述:三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。n范围在[1, 1000000]之间。示例1:输入:n = 3输出:4说明: 有四种走法示例2:输入:n = 5输出:13代码如下:class Solution {public: int waysToStep(int n) { if(n<=2){ re原创 2020-11-29 18:21:13 · 336 阅读 · 0 评论 -
LeetCode——198. 打家劫舍
题目描述:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。提示:0 <= nums.length <= 1000 <= nums[i] <= 400示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 =原创 2020-11-29 17:27:40 · 132 阅读 · 0 评论 -
LeetCode——121. 买卖股票的最佳时机(动态规划)
题目描述:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。示例 2:原创 2020-11-29 17:11:25 · 191 阅读 · 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 = “axc”, t = “原创 2020-11-29 16:06:12 · 209 阅读 · 0 评论 -
LeetCode——746. 使用最小花费爬楼梯
题目描述:数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i],i从0开始。每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。注意:cost 的长度将会在 [2, 1000]。每一个 cost[i] 将会是一个Integer类型,范围为 [0, 999]。示例 1:输入: cost = [10, 15, 20]输出: 15解释原创 2020-11-29 12:54:16 · 244 阅读 · 0 评论 -
LeetCode——面试题 17.16. 按摩师
题目描述:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。示例 1:输入: [1,2,3,1]输出: 4解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。示例 2:输入: [2,7,9,3,1]输出: 12解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。示例原创 2020-11-28 22:10:45 · 224 阅读 · 0 评论 -
LeetCode——53. 最大子序和(动态规划)
题目描述:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。定义:dp[i] 表示以 nums[i] 这个数结尾的最长连续子序列和。代码如下:class Solution {public: int maxSubArray(vector<int>& nums) { in原创 2020-11-28 21:01:07 · 189 阅读 · 0 评论 -
LeetCode——509. 斐波那契数
题目描述:代码如下:class Solution {public: int fib(int N) { int a=0; int b=1; int c; if(N==0) { return a; } else if(N==1) { return b; } else {原创 2020-11-27 19:40:10 · 127 阅读 · 0 评论 -
LeetCode——322. 零钱兑换
题目描述:给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。1 <= coins.length <= 121 <= coins[i] <= 231 - 10 <= amount <= 104示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示原创 2020-11-27 21:03:00 · 270 阅读 · 0 评论 -
LeetCode——1143. 最长公共子序列(动态规划)
题目描述:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。提示:1 <= text1.length <= 100原创 2020-11-28 15:39:08 · 319 阅读 · 0 评论 -
LeetCode——72. 编辑距离
题目描述:给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)示例 2:输入:word1 = “inte原创 2020-11-28 16:31:14 · 173 阅读 · 0 评论 -
LeetCode——300. 最长上升子序列(动态规划)
题目描述:给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。例如:定义:dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度。根据对 dp 数组的定义,现在想求 dp[5] 的值,也就是想求以 nums[5] 为结尾的最长递增子序列。nums[5] = 3,既然是递增子序列,我们只要找到前面那些结尾比 3 小的子序列,然后把 3 接到最后原创 2020-11-28 18:16:31 · 253 阅读 · 0 评论