DP
DP
_Charison
这个作者很懒,什么都没留下…
展开
-
leetcode 45. 跳跃游戏 II
@(labuladong的算法小抄)[dp, 贪心]leetcode 45. 跳跃游戏 II题目描述解题思路参考:labuladong的算法小抄P377常规dp(会超时)时间复杂度是o(n^2),会超时!class Solution { public int jump(int[] nums) { int n = nums.length; int res = 0; /* dp[i]表示跳到nums[i]所需的最小次数 */原创 2021-03-05 21:10:11 · 117 阅读 · 1 评论 -
leetcode 5. 最长回文子串
@(labuladong的算法小抄)[dp, 双指针]leetcode 5. 最长回文子串题目描述解题思路参考:labuladong的算法小抄P373dp时间o(n²),空间o(n²)注意与最长回文子序列解法的区别。子串必须要求是连续的,因此,如果定义dp[i][j]表示s[i...j]最长回文子串的长度,则由dp[i+1][j-1]无法推出dp[i][j]class Solution { public String longestPalindrome(String s) {原创 2021-03-04 15:09:49 · 303 阅读 · 1 评论 -
leetcode 42. 接雨水
@(labuladong的算法小抄)[dp, 双指针]leetcode 42. 接雨水题目描述解题思路参考:labuladong的算法小抄P364dp时间o(n),空间o(n)class Solution { public int trap(int[] height) { int n = height.length; if (n <= 2) return 0; /* 定义:lMax[i]表示height[0...i]中最高柱子的高原创 2021-03-04 15:08:58 · 81 阅读 · 0 评论 -
leetcode 494. 目标和
@(labuladong的算法小抄)[回溯, dp]leetcode 494. 目标和题目描述解题思路参考:labuladong的算法小抄P207本题可以很容易画出一棵决策树:下面的方法都相当于在遍历这棵决策树。回溯 P207class Solution { private int res = 0; public int findTargetSumWays(int[] nums, int S) { if (nums.length == 0) ret原创 2021-03-04 15:07:24 · 132 阅读 · 0 评论 -
leetcode [337. 打家劫舍 III
@(labuladong的算法小抄)[dp]leetcode 337. 打家劫舍 III题目描述解题思路参考:labuladong的算法小抄P205注意,二叉树都是用自顶向下的递归形式,参考 leetcode 198.打家劫舍 中的做法class Solution { Map<TreeNode, Integer> memo; public int rob(TreeNode root) { memo = new HashMap<>();原创 2021-03-04 15:05:55 · 61 阅读 · 1 评论 -
leetcode 213. 打家劫舍 II
@(labuladong的算法小抄)[dp]leetcode 213. 打家劫舍 II题目描述解题思路参考:labuladong的算法小抄P203class Solution { public int rob(int[] nums) { int n = nums.length; if (n == 1) return nums[0]; return Math.max( robRange(nums, 0, n -原创 2021-03-04 15:05:13 · 71 阅读 · 1 评论 -
leetcode 198. 打家劫舍
@(labuladong的算法小抄)[dp]leetcode 198. 打家劫舍题目描述解题思路参考:labuladong的算法小抄P200自顶向下(递归)class Solution { int[] memo; public int rob(int[] nums) { int n = nums.length; if (n == 0) return 0; memo = new int[n]; Arrays.fil原创 2021-03-04 15:04:31 · 62 阅读 · 1 评论 -
leetcode 518. 零钱兑换 II
@(labuladong的算法小抄)[dp]leetcode 518. 零钱兑换 II题目描述解题思路错误解法!!由于是组合数,所以可能会出现重复,比如金额为3,可以用[1, 2]凑出,也可以用[2, 1]凑出,下面这种解法无法避免这种重复。而完全背包的思路确保了选择硬币的顺序性,将一堆硬币放在背包面前,如1111…2222…555555…(硬币无限),然后从第一个硬币开始选择是否装入背包,先把面额1的硬币全选完,然后再对面额2的硬币选择,因此能够避免重复组合。/* 错误解法!! */cl原创 2021-03-04 15:03:49 · 162 阅读 · 1 评论 -
leetcode 0-1背包问题
@(labuladong的算法小抄)[dp]leetcode 0-1背包问题题目描述解题思路参考:labuladong的算法小抄P188class Solution { public int knapsack(int W, int N, int[] wt, int[] val) { /* 定义:对于前i个物品,当前背包容量为w,可装的最大价值为dp[i][w] */ /* base case dp[...][0] = dp[0][...] = 0 */原创 2021-03-04 15:02:56 · 103 阅读 · 1 评论 -
leetcode 416. 分割等和子集
@(labuladong的算法小抄)[dp]leetcode 416. 分割等和子集题目描述解题思路参考:labuladong的算法小抄P192题目实质上在问:给一个可装载重量为sum / 2的背包和N个物品,每个物品的重量为nums[i]。现在让你装物品,是否存在一种装法,能够恰好将背包装满?class Solution { public boolean canPartition(int[] nums) { int n = nums.length; i原创 2021-03-04 15:02:04 · 151 阅读 · 1 评论 -
leetcode 312. 戳气球
@(labuladong的算法小抄)[dp]leetcode 312. 戳气球题目描述解题思路参考:labuladong的算法小抄P181class Solution { public int maxCoins(int[] nums) { int n = nums.length; if (n == 0) return 0; /* 在两端加入两个虚拟气球 */ int[] points = new int[n + 2];原创 2021-03-04 15:01:10 · 57 阅读 · 0 评论 -
leetcode 887. 鸡蛋掉落
@(labuladong的算法小抄)[dp]leetcode 887. 鸡蛋掉落题目描述解题思路本题的问题为:最坏情况下,至少要扔几次鸡蛋,才能确定楼层F思路一:超时的dp参考:labuladong的算法小抄P168class Solution { public int superEggDrop(int K, int N) { /* 定义:鸡蛋数为k,可选楼层数为n时,最少扔鸡蛋次数为dp[k][n] */ int[][] dp = new int[原创 2021-03-02 14:25:11 · 142 阅读 · 0 评论 -
leetcode 651.四键键盘
@(labuladong的算法小抄)[dp]leetcode 651.四键键盘(中等)题目描述解题思路参考:labuladong的算法小抄P162这种题目的参数不是数组,仅仅是一个数N,所以需要自己思考状态究竟是什么思路一随着我们敲击键盘,剩余的敲击次数会减少(状态一),屏幕上的A会增加(状态二),剪切板中的A也会变化(状态三)但这种思考方式下,由于状态二和状态三最多是多少我们很难计算,导致dp数组或备忘录很难定义,无法剪枝,所以并不好class Solution { publi原创 2021-03-02 14:22:41 · 251 阅读 · 0 评论 -
leetcode 10. 正则表达式匹配
@(labuladong的算法小抄)[dp]leetcode 10. 正则表达式匹配题目描述解题思路参考:labuladong的算法小抄P155class Solution { public boolean isMatch(String s, String p) { int m = s.length(), n = p.length(); /* dp[i][j]表示 s[0...i-1] 和 p[0...j-1]能否匹配 */ bo原创 2021-03-02 14:21:10 · 76 阅读 · 0 评论 -
leetcode 1312. 让字符串成为回文串的最少插入次数
@(labuladong的算法小抄)[dp]leetcode 1312. 让字符串成为回文串的最少插入次数题目描述解题思路参考:labuladong的算法小抄P148class Solution { public int minInsertions(String s) { int n = s.length(); if (n == 1) return 0; /* dp[i][j]表示让s[i...j]成为回文串的最少操作次数 */原创 2021-03-02 14:19:15 · 118 阅读 · 0 评论 -
leetcode 354. 俄罗斯套娃信封问题
@(labuladong的算法小抄)[dp]leetcode 354. 俄罗斯套娃信封问题题目描述解题思路参考:labuladong的算法小抄P104常规dp为什么在按宽度升序排列后,判断时仍然需要宽度严格大于?因为宽度存在相同的情况,所以还需要判断。class Solution { public int maxEnvelopes(int[][] envelopes) { int n = envelopes.length; if (n == 0) r原创 2021-03-02 14:18:17 · 147 阅读 · 0 评论 -
leetcode 53. 最大子序和
@(labuladong的算法小抄)[dp]leetcode 53. 最大子序和题目描述解题思路参考:动态规划设计:最大子数组常规dpclass Solution { public int maxSubArray(int[] nums) { int n = nums.length; /* dp[i]表示以nums[i]结尾的最大子序和 */ int[] dp = new int[n]; /* base case */原创 2021-03-02 14:17:13 · 57 阅读 · 0 评论 -
leetcode 516. 最长回文子序列
@(labuladong的算法小抄)[dp]leetcode 516. 最长回文子序列题目描述解题思路参考:子序列解题模板:最长回文子序列class Solution { public int longestPalindromeSubseq(String s) { if (s == null) return 0; int n = s.length(); /* 定义:dp[i][j]表示s[i...j]的最长回文子序列的长度 */原创 2021-03-02 14:16:01 · 121 阅读 · 0 评论 -
leetcode 72. 编辑距离
@(labuladong的算法小抄)[dp]leetcode 72. 编辑距离题目描述解题思路参考:经典动态规划:编辑距离对“dp[i-1][j-1] 表示替换操作,dp[i-1][j] 表示删除操作,dp[i][j-1] 表示插入操作。”的补充理解:以 word1 为 “horse”,word2 为 “ros”,且 dp[5][3] 为例,即要将 word1的前 5 个字符转换为 word2的前 3 个字符,也就是将 horse 转换为 ros,因此有:(1) dp[i-1][j-1],即原创 2021-03-01 14:53:55 · 205 阅读 · 0 评论 -
leetcode 300. 最长上升子序列
@(labuladong的算法小抄)[dp]leetcode 300. 最长上升子序列题目描述解题思路参考:动态规划设计之最长递增子序列class Solution { public int lengthOfLIS(int[] nums) { if (nums.length == 0) return 0; /* 定义:dp[i]表示以nums[i]结尾的最长上升子序列的长度 */ int[] dp = new int[nums.length原创 2021-03-02 14:12:45 · 50 阅读 · 0 评论 -
leetcode 712. 两个字符串的最小ASCII删除和
@(labuladong的算法小抄)[dp]leetcode 712. 两个字符串的最小ASCII删除和题目描述解题思路参考:https://labuladong.gitbook.io/algo/dong-tai-gui-hua-xi-lie/1.2-zi-xu-lie-lei-xing-wen-ti/lcs修改LCS算法(递归)class Solution { int[][] memo; public int minimumDeleteSum(String s1, Stri原创 2021-03-01 15:01:48 · 115 阅读 · 0 评论 -
leetcode 583. 两个字符串的删除操作
@(labuladong的算法小抄)[dp]leetcode 583. 两个字符串的删除操作题目描述解题思路参考:https://labuladong.gitbook.io/algo/dong-tai-gui-hua-xi-lie/1.2-zi-xu-lie-lei-xing-wen-ti/lcs直接复用LCS算法题目让我们计算将两个字符串变得相同的最少删除次数,那我们可以思考一下,最后这两个字符串会被删成什么样子?删除的结果不就是它俩的最长公共子序列嘛!那么,要计算删除的次数,就可以通过原创 2021-03-01 15:01:06 · 81 阅读 · 0 评论 -
leetcode 1143. 最长公共子序列
@(labuladong的算法小抄)[dp]leetcode 1143. 最长公共子序列题目描述解题思路参考:详解最长公共子序列问题,秒杀三道动态规划题目递归import java.util.Arrays;class Solution { /* 备忘录,消除重叠子问题 */ private int[][] memo; public int longestCommonSubsequence(String text1, String text2) {原创 2021-03-01 15:00:02 · 76 阅读 · 0 评论 -
leetcode 322.零钱兑换
@(labuladong的算法小抄)[dp]leetcode 322.零钱兑换题目描述解题思路常规dp参考https://labuladong.gitbook.io/algo/di-ling-zhang-bi-du-xi-lie/dong-tai-gui-hua-xiang-jie-jin-jie状态:目标金额amount选择:不同面额的硬币coindp定义:dp[i]表示,当目标金额为i时,至少需要dp[i]枚硬币凑出base case:dp[0] = 0转移方程:dp[i] =原创 2021-03-01 14:58:52 · 107 阅读 · 0 评论 -
leetcode 509.斐波那契数
@(labuladong的算法小抄)[dp]leetcode 509.斐波那契数题目描述解题思路参考https://labuladong.gitbook.io/algo/di-ling-zhang-bi-du-xi-lie/dong-tai-gui-hua-xiang-jie-jin-jie动态规划状态:f的计算结果选择:只有一种选择,就是f(n)=f(n-1)+f(n-2)dp定义:dp[i]表示,当输入为i时,f(i)的计算结果为dp[i]。base case:dp[0] = 0,原创 2021-03-01 14:57:09 · 56 阅读 · 0 评论