03 2023 档案

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