随笔分类 - 算法训练营
摘要:1、leetcode84 柱状图中的最大矩形 思路【宫水三叶题解】 最终矩形的高度必然取自某个heights[i],因此我们可以枚举最终矩形的高度来做。 问题转换为当使用某个heights[i]作为矩形高度时,该矩形所能取得的最大宽度为多少。 假设我们能够预处理出 l 和 r 数组 l[i]代表位置
阅读全文
摘要:1、leetcode503 下一个更大元素Ⅱ class Solution { public int[] nextGreaterElements(int[] nums) { int[] res = new int[nums.length]; Arrays.fill(res, -1); Deque<I
阅读全文
摘要:1、单调栈 单调栈的使用场景 通常是一维数组,要寻找任意一个元素 的右边或左边 第一个比自己大或者小的元素的位置 单调栈的时间复杂度 O(n) 单调栈的原理 单调栈的本质:空间换时间 因为在遍历过程中需要一个栈来记录右边第一个比当前元素高的元素 优点是整个数组只需要遍历一次, 时间复杂度:O(n)
阅读全文
摘要:1、leetcode647 回文子串 动规五部曲 是否是回文子串,如果是dp[i] [j]为true,否则为false 递推公式 s[i] == s[j] 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串 情况二:下标i 与 j相差为1,例如aa,也是回文子串 情况三:下标:i 与 j相
阅读全文
摘要:1、leetcode583 两个字符串的删除操作 动归五步法 dp[i] [j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。 递推公式 word1[i-1] == word2[j-1] dp[i] [j] = dp[i-1] [j-
阅读全文
摘要:1、leetcode392 判断子序列 动规五部曲 dp[i] [j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i] [j]。 递推公式 if(s.charAt(i-1) == t.charAt(j-1)) { dp[i][j] = dp[i-1][
阅读全文
摘要:1、leetcode1143 最长公共子序列 动规五部曲 dp[i] [j] = 长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列的长度 下标定义到i-1与j-1 ==》为了简化dp数组第一行和第一列的初始化逻辑 递推公式 主要就是两大情况:
阅读全文
摘要:1、leetcode300 最长递增子序列 动规五部曲 dp[i] : 以nums[i]结尾的数组的递增子序列的最大长度 做递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 否则这个比较就没有意义了 递
阅读全文
摘要:1、leetcode491 递增子序列 回溯三部曲 递归参数 本题求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。 List<Integer> path = new LinkedList<>(); List<List<Integer>> res = ne
阅读全文
摘要:1、leetcode309 最佳买卖股票时机含冷冻期 动规五部曲 dp[i] [j] : 第i天状态j时,所能获得的最大金额 持有股票 j=0 之前就处于买入状态,之后无操作 dp[i] [0] = dp[i-1] [0] 当天买入 (之前处于不持有股票状态,且要经历完一天冷冻期 ==》j=1,j=
阅读全文
摘要:1、leetcode123 买卖股票的最佳时机Ⅲ 动规五步法 dp[i] [j] : 在第i天,j状态下能获得的最大利润 j = 0 : 第一次持有 j = 1:第一次不持有 j = 2:第二次持有 j = 3:第二次不持有 递归公式 dp[i] [0] = max( dp[i-1] [0] , -
阅读全文
摘要:1、leetcode121 买卖股票的最佳时机 暴力破解,超时 class Solution { public int maxProfit(int[] prices) { int res = 0; for(int i=0; i<prices.length; i++) { for(int j=i+1;
阅读全文
摘要:1、leetcode198 打家劫舍 动规五步法 dp[i]:偷盗房屋序号为i的房屋时,能偷窃到的最高金额 递归公式 偷第i间房:dp[i] = dp[i-2] + nums[i] 不偷第i间房:dp[i] = dp[i-1] dp[i] = max(dp[i-2] + nums[i], dp[i-
阅读全文
摘要:1、leetcode139 单词拆分 问题分析==》完全背包问题 背包:字符串s 物品:字典中的字符串(每个字符串可重复使用) 动规五步法 dp[i] :字符串长度为i,若dp[i]为true,则表示可以将该字符串拆分为一个或多个在字典中出现的单词。 递归公式 if dp[j]==true && s
阅读全文
摘要:1、leetcode70 爬楼梯 需要 n 阶才能到达楼顶,每次可以爬 1 或 2 个台阶。 转化为完全背包问题 背包容量:n 物品【物品可以反复使用】 价值:1、2 重量(所占背包容量):1 代码 class Solution { public int climbStairs(int n) { /
阅读全文
摘要:1、leetcode518 零钱兑换Ⅱ【完全背包应用】【求组合数】 class Solution { public int change(int amount, int[] coins) { int[] dp = new int[amount+1]; dp[0] = 1; for(int i=0;
阅读全文
摘要:1、leetcode1049 最后一块石头的重量Ⅱ 思路 尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小 转化为01背包问题:从stones 数组中选择,凑成总和不超过sum/2的最大价值。 其中「重量」&「价值」均为数值本身。 代码 class Solution { public int l
阅读全文
摘要:1、leetcode416 分隔等和子集 转化为01背包问题 背包的体积为sum / 2 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值 背包如果正好装满,说明找到了总和为 sum / 2 的子集。 背包中每一个元素是不可重复放入。 class Solution { publ
阅读全文
摘要:1、leetcode343 整数拆分 class Solution { public int integerBreak(int n) { // dp[i] : 对i分解得到的最大乘积 int[] dp = new int[n+1]; // 对0 1 分解无意义 => 对dp[0] dp[1] 初始化
阅读全文
摘要:1、leetcode62 不同路径 步骤 确定dp数组(dp table)以及下标的含义 dp[i] [j] : 从(0,0)到(i,j)的路径数量 确定递推公式 (i,j) 可由 (i-1,j)、(i,j-1)到达【已知:每次只能向下或者向右移动一步】 dp[i] [j] = dp[i-1] [j
阅读全文

浙公网安备 33010602011771号