
动态规划
wjy_1126
这个作者很懒,什么都没留下…
展开
-
不同路径II-动态规划
题目一个机器人位于一个 m x n 网格的左上角机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。示例输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输出:2算法1.dp[i]表示从(0,0)点到(i,j)的路径数2.要走到(i,j)点有两种办法,要么从(i-1,j)点向下走或者从(i,j-1)点向.原创 2022-02-11 15:05:13 · 128 阅读 · 0 评论 -
使用最小花费爬楼梯-动态规划
题目给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例输入:cost = [10,15,20]输出:15算法d[i]表示爬到第i级台阶所需的最小花费代码class Solution { // dp[i] 表示爬到第i阶台阶的最小花费 // 因为可从第0阶.原创 2022-02-11 14:59:05 · 162 阅读 · 0 评论 -
买卖股票的最好时机II-动态规划
题目给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。返回 你能获得的 最大 利润 。示例输入: prices = [7,1,5,3,6,4]输出: 7算法dp[i][0]表示在第i天不持有股票赚的钱dp[i][1]表示在第i天持有股票转的钱代码public int maxProfit(int[] pric.原创 2022-02-11 14:47:28 · 63 阅读 · 0 评论 -
分割回文串-动态规划、回溯
题目给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。示例输入:s = “aab”输出:[[“a”,“a”,“b”],[“aa”,“b”]]算法注释代码class Solution { List<List<String>> res = new ArrayList<>(); List<String> cur = new ArrayList<&g.原创 2022-02-11 14:20:30 · 195 阅读 · 0 评论 -
回文子串-动态规划
题目给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例输入:s = “abc”输出:3算法dp[i][j]表示s[i…j]是否是回文串只有但s[i]==s[j]时,才有可能是回文串如果i+1 >= j-1,则不需要看dp[i+1][j-1]是否是回文串否则,要看dp.原创 2022-02-11 12:01:36 · 242 阅读 · 0 评论 -
不同路径-动态规划
题目一个机器人位于一个 m x n 网格的左上角机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径?示例输入:m = 3, n = 7输出:28算法dp[i][j]表示从(0,0)走到(i,j)的路径数目前一步要么从上面下来,要么从左边过来。dp[i][j] = dp[i-1][j] + dp[j][i-1]代码class Solution { public int uniquePaths(int m, int.原创 2022-02-11 10:33:56 · 83 阅读 · 0 评论 -
最长公共子序列-动态规划
题目给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。示例输入:text1 = “abcde”, text2 = “ace”输出:3算法dp[i][j]表示a[0…i]与b[0…j]的最长公共子序列如果a[i] == b[j],则dp[i][j] = 1 + dp[i-1][j-1];如果a[i] != b[j],则dp[i][j] = max(dp[i-1][j], dp[i][j-1]);.原创 2022-02-11 10:22:29 · 174 阅读 · 0 评论 -
整数拆分-动态规划
题目给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。示例输入: n = 10输出: 36算法dp[i]表示正整数i拆分后的最大乘积对于一个数有两种拆分情况,拆分成两个数,拆分成三个及以上个数代码class Solution { public int integerBreak(int n) { int[] dp = new int[n+1]; dp[2] = 1;.原创 2022-02-10 16:30:02 · 496 阅读 · 0 评论 -
最小路径和-动态规划
题目给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。示例输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7算法dp[i][j]表示从左上角到(i,j)点的最小距离代码class Solution { public int minPathSum(int[][] grid) { int m = grid.length; int n =.原创 2022-02-10 16:08:41 · 54 阅读 · 0 评论 -
最长递增子序列-动态规划、二分
题目给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。处。示例输入:nums = [10,9,2,5,3,7,101,18]输出:4算法dp[i]表示以nums[i]点结尾的最长递增子序列的长度nums[i]之前的所有比nums[i]小的点都可以是nums[i]之前的点dp[i] = max(dp.原创 2022-02-10 15:40:59 · 99 阅读 · 0 评论 -
最长有效括号-动态规划
题目给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例输入:s = “)()())”输出:4动态规划dp[i]表示以s[i]为结尾的最长有效括号s[i] =’('时,dp[i]必然为0s[i] = ’ ) ’ 时,如果s[i-1] = ’ ( ‘,则dp[i] = dp[i-2] + 2如果s[i-1]= ‘)’,且s[i-1-dp[i-1]] =’'则dp[i] = dp[i-1] + 2 + dp[i-2-dp[i-.原创 2022-02-10 14:22:47 · 522 阅读 · 0 评论 -
打家劫舍-动态规划
题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例输入:[1,2,3,1]输出:4算法f[i]表示必选nums[i]的最大和g[i]表示必不选nums[i]的最大和f[i] = nums[i] + g[i-1];g[i].原创 2022-02-10 13:47:19 · 78 阅读 · 0 评论 -
乘积最大子数组
题目给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例输入: [2,3,-2,4]输出: 6算法max[i]表示以nums[i]点结尾的子数组的最大乘积min[i]表示以nums[i]点结尾的子数组的最小乘积对于以nums[i]点结尾的子数组来说,要么只有nums[i],要么nums[i]前面有nums[i-1]当nums[i]前面有nums[i-1]且num[i]>0时,dp[i] .原创 2022-02-10 13:20:23 · 204 阅读 · 0 评论 -
跳跃游戏 II-动态规划
题目给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。示例输入: nums = [2,3,1,1,4]输出: 2算法dp[i]表示跳到i点的最小跳跃步数last表示第一个可以跳到i点的点dp[i] = dp[last] + 1代码class Solution { public int jump(i.原创 2022-02-10 12:22:21 · 2167 阅读 · 0 评论 -
编辑距离-动态规划
题目给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例输入:word1 = “horse”, word2 = “ros”输出:3算法dp[i][j]表示将word1[0…i]变成word2[0…j]的最少操作步骤代码class Solution { public int minDistance(String word.原创 2022-02-09 17:10:37 · 54 阅读 · 0 评论 -
最大子数组和-动态规划、分治
题目给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6动态规划算法dp[i]表示以nums[i]为结尾的连续子数组的最大和以nums[i]为结尾的连续子数组的最大和有两种情况情况1.nums[i]孤身一人,即dp[i] = nums[i]情况2.nums[i]前面有人,即dp[i] = dp[i-1] +.原创 2022-02-09 16:35:48 · 264 阅读 · 0 评论 -
买卖股票的最好时机-动态规划
题目给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例输入:[7,1,5,3,6,4]输出:5算法dp[i]表示从第0天到第i天的最低价格,最低价格要么是今天要么是从第0天到第i-1天的最低价格用今天的价格减去从第0天到.原创 2022-02-09 16:10:00 · 245 阅读 · 0 评论 -
最长回文串-动态规划
题目给你一个字符串 s,找到 s 中最长的回文子串。示例输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。算法dp[i][j]表示下标从i到j的子字符串是否是回文串如果下标从i到j的子字符串是回文串则s.charAt(i)必然等于s.charAt(j),也就是s.charAt(i) == s.charAt(j)下标从i+1到j-1的子字符串是回文串,也就是dp[i+1][j-1] == true但下标从i+1到j-1可能不是合法的字符串下标.原创 2022-02-09 14:44:42 · 95 阅读 · 0 评论 -
正则表达式匹配-动态规划
题目给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。‘.’ 匹配任意单个字符'’ 匹配零个或多个前面的那一个元素示例输入:s = “aa” p = “a”输出:false解释:“a” 无法匹配 “aa” 整个字符串。算法代码在这里插入代码片...原创 2022-02-09 15:48:56 · 410 阅读 · 0 评论 -
爬楼梯-动态规划
题目假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例输入:n = 2输出:2算法dp[i]表示爬到第i阶的不同方案爬到第i阶的前一步有2中可能,从第i-1阶爬1步,或者从第i-2阶爬2步即dp[i] = dp[i-1] + dp[i-2]代码class Solution { public int climbStairs(int n) { if (n <= .原创 2022-02-09 15:15:02 · 59 阅读 · 0 评论 -
接雨水-动态规划
题目给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例输入:height = [4,2,0,3,2,5]输出:9算法leftMax[i]表示从0号柱子到i号柱子中的最高柱子高度rightMax[i]表示从n-1号柱子到i号柱子中的最高柱子高度从0号柱子到i号柱子中的最高柱子要么是i号柱子要么是从0号柱子到i-1号柱子中的最高柱子即leftMax[i] = Math.max(leftMax[i-1], height[.原创 2022-02-09 15:02:46 · 227 阅读 · 0 评论