03 2023 档案
摘要:LC139. 单词拆分 dp[i]含义 : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词 遍历顺序:如题说,是拆分为一个或多个在字典中出现的单词,所以这是完全背包 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 如果求排列数就是外层for遍历背包
阅读全文
摘要:LC647. 回文子串 动态规划法: **遍历顺序:**从下往上,从左往右 当s[i]与s[j]相等时,需要考虑三种情况: 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串 情况二:下标i 与 j相差为1,例如aa,也是回文子串 情况三:下标:i 与 j 相差大于1的时候,例如cabac
阅读全文
摘要:LC583. 两个字符串的删除操作 简单题学方法,困难题用方法 实现了Carl哥题解中说的第二种动态规划,和“LC1143.最长公共子序列”基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删
阅读全文
摘要:LC392. 判断子序列 简单题学方法,困难题用方法 bool isSubsequence(string s, string t) { int size_s = s.size(); int size_t = t.size(); vector<vector<int>> dp(size_s + 1, v
阅读全文
摘要:LC1143. 最长公共子序列 相对于“LC718. 最长重复子数组”,那道题是要求连续的子序列,所以出现不相等的情况时,对当前格子赋0即可。而本题不要求连续,所以不能直接赋零,而是保持跟前面一个格子值一致或者保持跟上一层同位置一样的值(两者比较大小)。 dp[i]含义:对text2数组,以下标为
阅读全文
摘要:LC300. 最长递增子序列 dp[i]含义:i 之前包括 i 的以nums[i]结尾的最长递增子序列的长度 int lengthOfLIS(vector<int>& nums) { int size = nums.size(); vector<int> dp(size, 1); int maxLe
阅读全文
摘要:LC309. 最佳买卖股票时机含冷冻期 更多的状态转移: dp[i] [0]含义:持有股票的最多现金 分两种情况,一是昨天就持有,即dp[i - 1] [0]。二是昨天没持有(可能是昨天抛出了,或者是昨天之前更早抛出了),所以今天若要买新的股票,则起码要用前天抛出股票时剩的现金来购买,即 dp[i
阅读全文
摘要:LC123. 买卖股票的最佳时机Ⅲ 更多的状态转移: dp[i] [0]含义:第一次持有股票的最多现金 dp[i] [1]含义:第一次不持有股票的最多现金 dp[i] [2]含义:第二次持有股票的最多现金 dp[i] [3]含义:第二次不持有股票的最多现金 ////自写的一般实现方法 int max
阅读全文
摘要:LC121. 买卖股票的最佳时机 ////自写的一般实现方法 int maxProfit(vector<int>& prices) { int purchase = prices[0]; int maxProfit = 0; int todayProfit = 0; for (int i = 1;
阅读全文
摘要:LC198. 打家劫舍 自己写的版本,用pair<不取本次的最大收获, 取本次的最大收获>进行记录 int rob(vector<int>& nums) { int size = nums.size(); vector<pair<int, int>> dp(size); dp[0] = pair<i
阅读全文
摘要:LC70. 爬楼梯 原题其实是一道简单动规的题目。但其实本题稍加改动就是一道面试好题。 如改为:一步一个台阶,两个台阶,三个台阶,.......,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢? 1阶,2阶,.... m阶就是物品,楼顶就是背包。每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶
阅读全文
摘要:LC518. 零钱兑换Ⅱ 刚开始一气写成,没想到犯了个那么傻×的毛病 class Solution { public: int change(int amount, vector<int>& coins) { int size = coins.size(); vector<int> dp(amoun
阅读全文
摘要:01背包的应用 分割等和子集: 给一个weight的背包,尽量往里塞满,如果有刚刚塞满的组合,则返回true。问的是是否存在刚刚好塞满weight背包的组合。 最后一块石头的重量Ⅱ: 给一个weight的背包,尽量往里塞满,若能刚刚塞满,说明最后剩的一块石头重量为0(即不剩了)。 目标和:这道题就有
阅读全文
摘要:动态规划五部曲 确定dp[i]的含义 dp递推公式 dp数组如何初始化 确认dp数组遍历顺序 打印dp数组,主要用于调试 LC416. 分割等和子集 这道题是“背包问题”的应用,但其实不好看出来。 dp[i]的含义和递推公式 与 01背包问题一致。 这道题的dp数组中,物品的weight即为价值 注
阅读全文
摘要:动态规划五部曲 确定dp[i]的含义 dp递推公式 dp数组如何初始化 确认dp数组遍历顺序 打印dp数组,主要用于调试 LC343. 整数拆分 dp[i]含义:数字 i 被拆解后的最大乘积 递推公式:对多组dp[i] * [i - j] 求最大值 dp数组初始化:dp[1] = 1; dp[2]
阅读全文
摘要:动态规划五部曲 确定dp[i]的含义 dp递推公式 dp数组如何初始化 确认dp数组遍历顺序 打印dp数组,主要用于调试 LC62. 不同路径 dp[i] [j]含义:到达格子(i, j)中有dp[i] [j]种方法 递推公式:dp[i] [j] = dp[i] [j - 1] + dp[i - 1
阅读全文
摘要:动态规划五部曲 确定dp[i]的含义 dp递推公式 dp数组如何初始化 确认dp数组遍历顺序 打印dp数组,主要用于调试 LC509. 斐波那契数 dp[i]含义:第i个斐波那契数的值为dp[i] 递推公式:dp[i] = dp[i - 1] + dp[i - 2] dp数组初始化:dp[0] =
阅读全文
摘要:LC738. 单调递增的数字 用queue容器辅助实现的版本 int monotoneIncreasingDigits(int n) { deque<int> que; int temp = n; while (temp > 0) { que.emplace_front(temp % 10); te
阅读全文
摘要:LC435. 无重叠区间 贪心表现在每一步,都保证右边界尽量靠左,若两个区间出现重叠冲突,将右边界更新为两者右边界中较小的那个。 如排序后,[1,5],[2,4],[4,8],[5,6],[6,7],初始右边界为5,遇到[2,4]有冲突,+1并更新右边界为4,访问[4,8]后,right为8,遇到[
阅读全文
摘要:LC860. 柠檬水找零 bool lemonadeChange(vector<int>& bills) { int C5 = 0, C10 = 0; for (int i = 0; i < bills.size(); ++i) { if (bills[i] == 5) { ++C5; } else
阅读全文
摘要:LC1005. K 次取反后最大化的数组和 借用评论区的一句话——“普通人思维,无数个if else”。 void NegationsLoop(vector<int>& nums, int k, int pos) { if (k % 2 != 0) nums[pos] = -nums[pos]; }
阅读全文
摘要:LC122. 买卖股票的最佳时机Ⅱ 一旦遇到相比于昨天降价的,就抛出,就购入低价的,直到又遇到下一个滑坡点,又立即抛出,计算收益 贪心算法表现在:总是在降价前抛出,获取收益,总是在降价当前抛出 这道题的另一个思考角度是,对原数组如[7,1,5,3,6,4],除第一天外求取利润数组,即[-6, 4,
阅读全文
摘要:LC445. 分发饼干 int findContentChildren(vector<int>& g, vector<int>& s) { int count = 0; sort(g.begin(), g.end()); sort(s.begin(), s.end()); for (int i =
阅读全文
摘要:LC332. 重新安排行程 做了很久,还是没有通过全部案例,最后是一个输入为100个元素的数组,运行超出时间限制。 LC51. N皇后 实现了回溯算法中的超暴力解法,主要是对某个节点的斜线,在用数学式去表示的思想没想到。 官方解法: auto columns = unordered_set(); /
阅读全文
摘要:跟“去重”相关的题目: 三数之和 组合之和Ⅱ 子集Ⅱ 递增子序列 在回溯算法题目中,去重问题分为**“树层去重”和“树枝去重”** 之前组合之和、子集中的去重使用的方法都是先排序,使用prev_pop记录每次在temp中pop出的值,解决的是“树层去重”。因为题目要求的是在当次temp中,是允许有重
阅读全文

浙公网安备 33010602011771号