03 2024 档案
摘要:last dance 柱状图中最大的矩形 leetcode:84. 柱状图中最大的矩形 单调栈 思路 和接雨水很类似,但需要首尾加0(尾0是为了触发计算,首0是为了避免首元素触发计算时没有left) 注意点 尾加0后还是要遍历到heights.size()-1,因为是以取出元素为基准计算的,而取出元
阅读全文
摘要:终于接到你 下一个更大元素Ⅱ leetcode:496. 下一个更大元素 I 单调栈 思路 主要是循环数组的处理。 直接等效为长度为2N,重复两遍的原数组即可,i<nums.size()变为i<2*nums.size()、i变为i%nums.size()。 代码实现 对每个元素都再遍历一遍原数组长度
阅读全文
摘要:每日温度 leetcode:739. 每日温度 单调栈 思路 单调栈,存放元素下标。 遍历一遍,每个元素和栈顶元素比较: <=栈顶元素,入栈 >栈顶元素,result[st.top()] = i - st.top();弹出 继续,直到遍历结束或<=栈顶元素 代码实现 class Solution {
阅读全文
摘要:子序列问题 最长递增子序列 leetcode:300. 最长递增子序列 动态规划 代码实现 /* 以nums[i]结尾的(含)递增子序列最长为dp[i] dp[i]由dp[0~i-1]的最大值推出 if(nums[i] > nums[j]) dp[i] = max(dp[i],dp[j] + 1);
阅读全文
摘要:DP最后一集 回文子串 leetcode:647. 回文子串 动态规划 代码实现 class Solution { public: /* s[i:j]回文子串个数为dp[i][j] if(s[i] == s[j]){ if(j-i <= 1) dp[i][j] = true; else dp[i][
阅读全文
摘要:两个字符串的删除操作 leetcode:583. 两个字符串的删除操作 动态规划 思路 先求最长子序长度 然后计算两个原字符串离最长子序长度差多少。 代码实现 class Solution { public: /* (之前搞错了)最长子序长度 word[0:i-1]和word2[0:j-1]的最长子
阅读全文
摘要:判断子序列 leetcode:392. 判断子序列 动态规划 代码实现 class Solution { public: /* 不连续子序列(公共子序) 0~i-1 0~j-1的最长公共子序长度是dp[i][j] if(s[i-1] == s[j-1]) dp[i][j] = dp[i-1][j-1
阅读全文
摘要:最长公共子序列 leetcode:1143. 最长公共子序列 动态规划 思路 和最长重复子序列很像,但是这个不要求连续。 意义略有不同,因此result不需要找最大值,直接就是最末的dp元素。 代码实现 class Solution { public: int longestCommonSubseq
阅读全文
摘要:day51 买卖股票的最佳时期含冷冻期 leetcode:309. 买卖股票的最佳时机含冷冻期 动态规划 代码实现 /* 意义:下标为i时各种情况的收益 dp[i][0] 持有 dp[i][1] 当天卖出 dp[i][2] 之前不持有 递推: dp[i][0] = max(dp[i-1][0],dp
阅读全文
摘要:day50 买卖股票的最佳时机Ⅲ leetcode:123. 买卖股票的最佳时机 III 动态规划 代码实现 /* 意义:下标为i时,不同状态收益为 dp[i][0] 未持有 dp[i][1] 第一次持有 dp[i][2] 第一次未持有 dp[i][3] 第二次持有 dp[i][4] 第二次未持有
阅读全文
摘要:day48 买卖股票的最佳时机 leetcode:121. 买卖股票的最佳时机 动态规划 代码实现 /* 意义:dp[i][0]下标为i天持有股票的最大收益;dp[i][1]下标为i天不持股的最大收益 递推: 之前买入、当天买入:dp[i][0] = max(dp[i-1][0],-prices[i
阅读全文
摘要:day47 打家劫舍 leetcode:198. 打家劫舍 动态规划 代码实现 /* 偷到下标为i的最大金额数为dp[i] 偷i、不偷i:dp[i] = max(dp[i-2]+nums[i],dp[i-1]); dp[0] = nums[0];dp[1] = max(nums[0],nums[1]
阅读全文
摘要:day46 单词拆分 leetcode:139. 单词拆分 动态规划 代码实现 /* 意义:长度为j的字符串能否被dict里的单词拼出为dp[j] 递推:if(dp[j] && j~i子串在dict里) dp[i] = true; 初始化:dp[0] = true 无意义,只是滚雪球起点;其余为fa
阅读全文
摘要:day45 爬楼梯进阶 卡码网:爬楼梯(第八期模拟笔试) 动态规划 代码实现 /* 总和为j总共有dp[j]种方法(可重复选取、排列) dp[j] += dp[j-nums[i] dp[0] = 1;其余为0 先背包再物品,正序 */ #include<iostream> #include<vect
阅读全文
摘要:day44 完全背包 卡码网:携带研究材料(第七期模拟笔试) 动态规划 思路 完全背包,物品可以无限次取,正序遍历。 复杂度分析 时间复杂度:O(N^2)。 空间复杂度:O(N)。 代码实现 #include<iostream> #include<algorithm> #include<vector
阅读全文
摘要:day43 最后一块石头的重量Ⅱ leetcode:1049. 最后一块石头的重量 II 动态规划 思路 a-b + c-d + e-f = (a+c+e) - (b+d+f) 等效于两堆石头相碰,最小可能重量就是最接近平均的两堆相碰。 复杂度分析 时间复杂度:O(N^2)。 空间复杂度:O(N)。
阅读全文
摘要:有点抽象 0-1背包 卡码网:携带研究材料(第六期模拟笔试) 动态规划 思路 二维: 意义:0~i物品内,放进容量为j的背包,最大价值为dp[i][j] 递推:dp[i][j] = max(dp[i-1][j-weight[i],dp[i-1][j]) 初始化:第一列为0,第一行j>=weight[
阅读全文
摘要:渐入佳境 整数拆分 leetcode:343. 整数拆分 动态规划 思路 意义:i拆分乘积的最大值为dp[i] 递推:dp[i] = max{dp[i],j*(i-j),j*dp[i-j]} 初始化:从2开始可以拆,有意义,dp[2] = 1,其他为0 遍历顺序: for(int i = 3;i <
阅读全文
摘要:DP初体验 不同路径 leetcode:62. 不同路径 动态规划 思路 意义:到达i行j列时有dp[i][j]种走法 递推: if(i-1 >= 0) dp[i][j] += dp[i-1][j]; if(j-1 >= 0) dp[i][j] += dp[i][j-1]; 初始化:dp[0][0]
阅读全文
摘要:爬到下标为i的位置所需最小花费为dp[i] dp[i] = min(dp[i-1] + cost[i-1],dp[i-2] + cost[i-2]) dp[0] = 0; dp[1] = 0; left to right 复杂度分析 时间复杂度:O(N)。a 空间复杂度:O(N)。(状态压缩后为O(
阅读全文
摘要:单调递增的数字 leetcode:738. 单调递增的数字 贪心法 思路 从后往前遍历,碰到不满足单调递增的,前一位数字--,标记当前位置。 从flag(包括)往后,全部赋值为9。 复杂度分析 时间复杂度:O(N)。 空间复杂度:O(N)。 N为数字位数。 注意点 数字->字符串用to_string
阅读全文
摘要:无重叠区间 leetcode:435. 无重叠区间 贪心法 思路 去掉最少的区间数就是最少重叠区间对的个数。(成对的算,因为一对里面需要去掉一个) 类似射气球的处理方式。 左边界法: 按左边界从小到大排序。 遍历每个元素。取当前元素右边界为right判断是否重叠。 如果[i]right > [i+1
阅读全文
摘要:柠檬水找零 leetcode:860. 柠檬水找零 贪心法 思路 遍历一遍数组,只关注面值5、10的钞票的数量 每轮判断:如果是5,five++;如果是10,判断还有没有5,有的话five--;如果是20,检查有没有一张10、一张5,ten--,five--。或者三张5,five-=3。 贪心:先消
阅读全文
摘要:K次取反后最大化的数组和 leetcode:1005. K 次取反后最大化的数组和 贪心法 思路 两次贪心:(每次取反k--) 排序,一次遍历,按绝对值从大到小地把负数取反。 如果K次取反没用完,再排序一次,反复取反最小元素。 (或者一开始就按绝对值从大到小排序,只需排序一次) 复杂度分析 时间复杂
阅读全文