动态规划
Betternw
这个作者很懒,什么都没留下…
展开
-
矩阵最长递增路径
题目给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。示例 1:输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]输出:4解释:最长递增路径为 [1, 2, 6, 9]。分析1.当一个格子的值大于等于它周围所有格子的值时,以该格子为起点的最长递增路径的长度为1;2.以格子A为起点的最长递增路径的长度 = 周围大于A的值原创 2021-08-08 15:52:09 · 869 阅读 · 0 评论 -
通配符匹配
题目描述请实现支持’?‘and’’.的通配符模式匹配‘?’ 可以匹配任何单个字符。'’ 可以匹配任何字符序列(包括空序列)。返回两个字符串是否匹配函数声明为:bool isMatch(const char s, const char p)下面给出一些样例:isMatch(“aa”,“a”) → falseisMatch(“aa”,“aa”) → trueisMatch(“aaa”,“aa”) → falseisMatch(“aa”, "") → trueisMatch(“aa”, "原创 2021-08-08 15:14:41 · 160 阅读 · 0 评论 -
换钱的最少货币数
题目描述给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。如果无解,请返回-1.【要求】时间复杂度O(n \times aim)O(n×aim),空间复杂度On。示例1输入:[5,2,3],20返回值:4示例2输入:[5,2,3],0返回值:0代码import java.util.*;public class Solution { /**原创 2021-08-07 20:38:50 · 119 阅读 · 0 评论 -
最小编辑代价
题目描述给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。输入:“abc”,“adc”,5,3,2返回值:2分析1.动态规划:dp[i][j]表示word1的前i个字符编辑成word2的前j个字符需要的最小操作数2.初始状态:dp[i][0] = i,i次删除;dp[0][i] = i,i次插入3.过渡公式:当i字符等于j字符时:dp[i][j] = dp[i-1][j-1],不需要额外操作原创 2021-08-01 16:15:34 · 99 阅读 · 0 评论 -
最长公共子串
题目描述给定两个字符串str1和str2,输出两个字符串的最长公共子串题目保证str1和str2的最长公共子串存在且唯一。示例1输入:“1AB2345CD”,“12345EF”返回值:“2345”代码public String LCS(String str1, String str2) { int maxLenth = 0;//记录最长公共子串的长度 //记录最长公共子串最后一个元素在字符串str1中的位置 int maxLastIndex = 0; int原创 2021-08-01 15:14:36 · 130 阅读 · 0 评论 -
【动态规划】72 编辑距离
题目描述给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)分析啥叫编辑距离?我们说word1和word原创 2021-06-10 18:15:05 · 108 阅读 · 0 评论 -
【for循环 每个位置能到达的最远位置】 55 跳跃游戏
题目给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。输入: [2,3,1,1,4]输出: true输入: [3,2,1,0,4]输出: false思路如果能从某个点跳到中点,那么从左边任何一个点出发都可以跳到终点。因为可以每次只跳一步。因此此题转换为寻找是否有一个点可以直接跳到终点。无法到达的判断条件:当数组长度大于可以到达的最远距离时。代码public boolean canJump(int[] n原创 2020-06-21 15:00:54 · 212 阅读 · 0 评论 -
【递归 卡特兰数】
思路G(n):表示长度为n的序列不同的二叉搜索树的个数 G(0)=1,G(1)=1F(i):表示以i为根的不同二叉搜索树个数。左子树节点个数为i-1个,右子树节点个数为n-i个。f(i)=G(i−1)∗G(n−i)因此,卡特兰数:G(n)=G(0)∗G(n−1)+G(1)∗(n−2)+…+G(n−1)∗G(0) / G(n)=∑G(i−1)⋅G(n−i)...原创 2020-06-18 23:01:53 · 897 阅读 · 0 评论 -
【动态规划】 n个色子的点数
题目把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]思路dp数组表示共i个色子掷出s个点的次数。i个色子公有5*i+1种点数。dp[i][s]+=dp[i-1][s-j] //当前n个骰子出现的点数之和等于前原创 2020-07-14 09:55:05 · 412 阅读 · 0 评论 -
【双指针 动态规划dp数组】5 最长回文子串
题目给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。思路暴力法定义一个判定回文的方法。双指针移动,当i-j之间的子串满足回文且本次的长度大于上次的长度,更新最大长度值,并用一个指针记录当前的i也就是字符串的开头位置。代码public String longestPalindrome(String s) { int len = s.length(); int原创 2020-06-11 16:28:49 · 149 阅读 · 0 评论 -
【动态规划 && 运算】offer64 计算1+2+3+4+...+n
题目求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例 1:输入: n = 3输出: 6示例 2:输入: n = 9输出: 45思路A && B:当A为false,不计算B,直接返回false。当A为true,计算B因此,将递归的返回条件作为A,当A为true的时候,执行B也就是递归主体!!!【注意这个递归】!!!!代码 public int sumNums(int n)原创 2020-07-14 11:13:49 · 358 阅读 · 0 评论 -
【动态规划】offer 46 把数字翻译成字符串
题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”思路dp数组表示当前结尾的表示形式次数。如果前两位数字属于10-25范围,那么 dp[i] = dp[i - 1] +原创 2020-07-09 17:50:34 · 126 阅读 · 0 评论 -
【背包问题】 offer14-1 剪绳子
题目给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1思路假设前面已经剪了长度i(只剪一刀),那么从i之后,要么不剪,要么剪了,乘积就是新剪长度的乘积最大值和和前面原创 2020-07-04 20:35:38 · 118 阅读 · 0 评论 -
offer10-1 斐波那契数列
题目写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.代码public int fib(int n) { if(n==0||n==1){ return n; } int []fibo = new int[n+1]; fibo[0] = 0; fibo[1] = 1; //原创 2020-07-04 16:01:15 · 153 阅读 · 0 评论 -
【背包】 offer 47 礼物的最大价值
题目在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物代码 public int maxValue(int[][] grid) { //背包问题原创 2020-07-09 18:19:25 · 172 阅读 · 0 评论 -
【动态规划】 647回文子串
题目给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。输入: “abc”输出: 3解释: 三个回文子串: “a”, “b”, “c”.输入: “aaa”输出: 6说明: 6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”.思路用数组dp【i】【j】表示是否为回文子串。首先,单个元素是回文。长度小于3且边界相等的是回文。其次,当边界相等,长度大于3的时候,判断通过:原创 2020-06-26 17:26:03 · 121 阅读 · 0 评论 -
【背包?。。动态规划】 416 分割等和子集
题目给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].思路二维数组和背包原理一维数组:dp【i】表示能否找到和为i的数组元素集合。代码public static boolean canPartition(int[] nums) { int len = nums.length; if (len == 0) { r原创 2020-06-27 19:26:50 · 92 阅读 · 0 评论 -
【动态规划 左右数组 0不偷1偷】 337 打家劫舍
思路后序遍历:需要先知道叶子节点的信息,才能决定父节点。原创 2020-07-03 19:38:58 · 3289 阅读 · 0 评论 -
【背包 动态规划 当前状态等于前一个能用coin表示的dp加1】 322 零钱兑换
题目给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。输入: coins = [1, 2, 5], amount = 11输出: 3解释: 11 = 5 + 5 + 1输入: coins = [2], amount = 3输出: -1思路建立数组,dp【i】表示和为i的硬币组合个数。初始化:dp【0】初始化为0.其余都初始化为i+1.这是因为如果有符合要求的组合,最多为i。i+原创 2020-06-29 21:16:55 · 122 阅读 · 0 评论 -
【贪心 动态规划 股票总结】 122 股票买卖
题目给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3思路动态规划原创 2020-07-02 16:08:16 · 171 阅读 · 0 评论 -
【动态规划】 309 最佳买卖股票含冷冻期
题目给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]思路股票问题不含冷冻期dp【】【3】增加一个维度,是冷冻期的情况。冷冻期前一天只有一种情况,原创 2020-07-03 19:04:18 · 107 阅读 · 0 评论 -
【动态规划 要么当前 要么之前j加1.最后比较所有得到最值】 300 最长上升子序列
题目给定一个无序的整数数组,找到其中最长上升子序列的长度。输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。思路建立dp【i】数组,表示nums中前i个数字的最长子序列长度每个元素都有两种取法,一种是1,一种是当前面有元素比当前小时,等于前面元素位置dp的长度加1.因为前面有上升序列的话,加上本元素,当前位置就是长度加1.这个序列不用管中间的元素,是间断性上升就可以。代码public int lengthOfL原创 2020-06-30 16:06:20 · 150 阅读 · 0 评论 -
【背包 +322】 279 完全平方数
题目难度中等469给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.输入: n = 13输出: 2解释: 13 = 4 + 9.分析和322硬币之和类似。dp数组表示当前数字被用完全平方数表示的个数和322相同的思路,dp每个元素都有一个最大值,如果可以表示的话依赖于减去完全平方和后的dp元素+1。取两者的最小值。代码public i原创 2020-06-30 15:40:23 · 96 阅读 · 0 评论 -
【动态规划 左右划分】 238 除自身以外数组的乘积
题目给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。输入: [1,2,3,4]输出: [24,12,8,6]思路建立两个数组,分别表示当前数字左边的乘积和右边的乘积。最终当前数的乘积是当前索引下左边和右边的乘积。代码public int[] productExceptSelf(int[] nums) { int []l = new int[nums.l原创 2020-06-30 15:13:25 · 125 阅读 · 0 评论 -
【动态规划 dp数组依赖于三个值 注意要选最小的】 221 最大正方形
题目在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。输入:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出:4分析dp矩阵表示以当前元素为右下角的矩形的边长第一列和第一行,当矩阵元素为1时,dp元素为1当不是第一列第一行,矩阵元素为时,dp元素等于左边上边左上角元素最小值加1.因为如果是正方形,那么上述上个元素应该都是1,如果有0那么当前dp就取1.如果没有0,那么正方形的边长就是周围正方形边长的最小值加1.(要想到当前原创 2020-06-30 11:29:07 · 137 阅读 · 0 评论 -
【动态规划】 198 打家劫舍
题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。1234示例 2:输入: [2原创 2020-06-06 00:20:07 · 100 阅读 · 0 评论 -
【递归】 139 单词拆分
题目给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。输入: s = “applepenapple”, wordDict = [“apple”, “pe原创 2020-06-24 11:10:43 · 122 阅读 · 0 评论 -
【动态规划】 121 买卖股票的最佳时机
题目描述思路双指针循环 将差值进行比较找到最大的单次循环 找出最小值 max与当前值与最小值的差值进行比较代码实现原创 2020-02-20 21:38:20 · 109 阅读 · 0 评论 -
【动态规划 dp数组 依赖于之前两个状态(相加) 初始化特殊值】 70 爬楼梯 丢棋子
题目假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?输入:2 输出:2 1+1/2输入:3 输出:3 1+1+1/1+2/2 +1分析动态规划,分析最优子结构。每次dp【i】需要的是dp【i-1】加1或者dp【i-2】加2.因为dp【i】的方法是dp【i-1】和dp【i-2】之和。代码public int climbStairs(int n){ if(n==1){ return 1; }原创 2020-06-05 22:15:07 · 211 阅读 · 0 评论 -
【动态规划 dp数组 for循环 依赖于前面状态(的最小值) 可以不建立数组直接在原数组上进行修改】 64 最小路径和
题目给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 7思路到达一个节点的路径之和,等于到达上一行节点和到达上一列节点最小值加上本身节点值。因此可以写出递归方程。grid[i][j] = Math.min(grid[i][j-1],grid[i-1][j])+grid[i][j];其中在第一行和第一列的节点,其值只能来自于前一列或者原创 2020-06-21 16:46:32 · 141 阅读 · 0 评论 -
【动态规划 dp数组 for循环 当前状态等于前两个状态相加】 62 不同路径
题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向右 -> 向下向右 -> 向下 -> 向右向下 -> 向右 -> 向右思路到达每一个节点的路径数目,都相当于到达上一行节点原创 2020-06-21 16:17:26 · 175 阅读 · 0 评论 -
【动态规划 连续数组 以每个数字为结尾的最大值 再比较出最大值】 53 最大子序和
题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。分析动态规划:List item...原创 2020-06-05 21:34:06 · 179 阅读 · 0 评论 -
【动态 规划】 offer 49丑数
题目我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。思路相当于维护三个数组,每个序列都是i×2、i×3,i×5,然后合并三个列表,每次选最小的,然后指针后移。思路代码 public int nthUglyNumber(int n) { int []dp = new int[n];原创 2020-07-10 21:43:28 · 101 阅读 · 0 评论 -
【动态规划 dp数组 for循环依赖于之前状态】 32 最长有效括号
题目给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。输入: “(()”输出: 2解释: 最长有效括号子串为 “()”输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”思路dp数组表示以i结尾的最长有效子字符串的长度。有效的字符串一定是以)结尾。因此对于以(结尾的子字符串,dp的值都是0.如果s【i】=)且s【i-1】=(,即形如‘‘……()",那么dp[i]=dp[i−2]+2如果s【i】=)且s【i-1】=),即形如 ‘‘…原创 2020-06-23 16:17:49 · 200 阅读 · 0 评论 -
【动态规划】 10 正则表达式匹配
题目给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。’.’ 匹配任意单个字符'’ 匹配零个或多个前面的那一个元素s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。思路...原创 2020-06-30 10:30:50 · 93 阅读 · 0 评论