![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
动态规划
力扣-Java
是瓜哥啊
这个作者很懒,什么都没留下…
展开
-
乘积最大子数组
乘积最大子数组给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。解法:动态规划遍历数组时计算当前最大值,不断更新令imax为当前最大值,则当前最大值为 imax = max(imax * nums[i]原创 2021-04-17 16:56:21 · 82 阅读 · 0 评论 -
打家劫舍Ⅲ
打家劫舍Ⅱ打家劫舍Ⅰ如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,4,5,1,3,null,1] 3 / \ 4 5 / \ \ 1 3 1输出: 9解释: 小偷一晚能够盗取的最高金额 = 4 + 5 = 9.解法:动态规划/递归/** * Definition for a binary tree node. * public class TreeNode原创 2021-04-17 16:15:44 · 57 阅读 · 0 评论 -
零钱兑换
零钱兑换给定不同面额的硬币 coins 和一个总金额amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coins = [1], amount = 0输出:0示例原创 2021-04-16 17:27:37 · 81 阅读 · 0 评论 -
n个骰子的点数
n个骰子的点数把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]解法:动态规划class Solution { public double[] dicesProbability(int n) {原创 2021-03-28 11:10:04 · 60 阅读 · 0 评论 -
把数字翻译成字符串
把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”,“mcfi"和"mzi”解法:动态规划dp[i]代表第i个结尾的数字的翻译方案数量。class Solution原创 2021-03-27 14:38:41 · 55 阅读 · 0 评论 -
回文子串
回文子串给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:“abc”输出:3解释:三个回文子串: “a”, “b”, “c”示例 2:输入:“aaa”输出:6解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”提示:输入的字符串长度不会超过 1000 。解法一:动态规划class Solution { public i原创 2021-03-25 13:46:08 · 83 阅读 · 0 评论 -
丑数
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。解法:动态规划class Solution { public int nthUglyNumber(int n) { if(n<=0) return -1; int[] dp=new int[n]; .原创 2021-03-18 18:08:55 · 64 阅读 · 0 评论 -
正则表达式匹配
正则表达式匹配给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例 1:输入:s = “aa” p = “a”输出:false解释:“a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa” p = “a*”输出:true解释:因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里原创 2021-03-10 11:15:54 · 343 阅读 · 0 评论 -
统计全为 1 的正方形子矩阵
统计全为 1 的正方形子矩阵给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。示例 1:输入:matrix =[[0,1,1,1],[1,1,1,1],[0,1,1,1]]输出:15解释:边长为 1的正方形有 10 个。边长为 2 的正方形有 4 个。边长为 3 的正方形有 1 个。正方形的总数 = 10 + 4 + 1 =15.示例 2:输入:matrix =[[1,0,1],[1..原创 2021-03-07 18:26:09 · 170 阅读 · 0 评论 -
最长公共子序列
最长公共子序列给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,“ace”是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。示例 1:输入:text1 = “abcde”, te原创 2021-03-07 16:26:43 · 56 阅读 · 0 评论 -
最长递增子序列
最长递增子序列给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组[0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:输入:nums = [0,1,0,3,2,3]输出:4示例 3:输入:nums = [原创 2021-03-07 15:46:35 · 453 阅读 · 0 评论 -
杨辉三角
杨辉三角给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。示例:输入: 5输出:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]解法:动态规划111121133114641class Solution { public List<List<Integer>> generate(i原创 2021-03-07 14:37:40 · 45 阅读 · 0 评论 -
爬楼梯
爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶解法:...原创 2021-03-06 19:39:06 · 67 阅读 · 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提示:m == grid.lengthn == grid[i].length1 <= m, n原创 2021-03-06 19:19:35 · 57 阅读 · 0 评论 -
不同路径
不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释: 从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向下 -> 向下向下 -> 向下 -> 向右向下 ->原创 2021-03-06 18:50:34 · 63 阅读 · 0 评论 -
最大子序和
最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [0]输出:0示例 4:输入:nums = [-1]输出:-1示例 5:输入:nums = [-100000]输出:-1000原创 2021-03-06 17:18:40 · 41 阅读 · 0 评论 -
最长回文子串
最长回文子串给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”示例 3:输入:s = “a”输出:“a”示例 4:输入:s = “ac”输出:“a”提示:1 <= s.length <= 1000s 仅由数字和英文字母(大写和/或小写)组成参考(非常详细)解法一:动态规划class Solu原创 2021-03-06 16:24:42 · 61 阅读 · 0 评论 -
最长的有效括号
最长的有效括号给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例 1:输入:s = “(()”输出:2解释:最长有效括号子串是 “()”示例 2:输入:s = “)()())”输出:4解释:最长有效括号子串是 “()()”示例 3:输入:s = “”输出:0提示:0 <= s.length <= 3 * 10^4s[i] 为 ‘(’ 或 ‘)’解法一:栈我们始终保持栈底元素为当前已经遍历过的元素中原创 2021-03-03 16:21:20 · 252 阅读 · 1 评论 -
买卖股票的最佳时机
买卖股票的最佳时机给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 =6)的时候卖出,最大利润 = 6-1 = 5 。注意利润原创 2021-02-23 15:04:56 · 61 阅读 · 0 评论 -
单词划分2
单词划分2给定一个非空字符串 s 和一个包含非空单词列表的字典wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明: 分隔时可以重复使用字典中的单词;你可以假设字典中没有重复的单词。示例 1:输入: s = “catsanddog” wordDict = [“cat”, “cats”, “and”, “sand”, “dog”]输出: [ “cats and dog”, “cat sand dog” ]示例 2:输原创 2021-02-13 20:26:17 · 135 阅读 · 0 评论 -
单词拆分
单词拆分给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true 解释: 返回 true因为 “leetcode” 可以被拆分成 “leet code”。示例 2:输入: s = “applepenapple”, word原创 2021-02-09 00:57:35 · 99 阅读 · 0 评论 -
分割回文串
分割回文串题目给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: “aab”输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]搜索问题主要使用回溯法。回溯法思考的步骤:1、画递归树;2、根据自己画的递归树编码。对于本题,我们尝试这样思考:要得到所有都是回文串的分割方案,我们就需要对字符串进行分割,至于需要分割几下,我们不知道。那么首先第一次分割的地方可以是第一个字符串之后,也可以是第二第三。。。个字原创 2021-02-02 00:20:54 · 101 阅读 · 0 评论 -
动态规划
动态规划题目描述你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。你的目标是确切地知道 F 的值是多少。无论 F 的初始值如何,你确定 F 的值的最转载 2021-01-29 11:20:20 · 105 阅读 · 0 评论