随笔分类 - 算法随想
小白刷题,望多多指教
摘要:int largestRectangleArea(vector& heights) { int result = 0; stack st; heights.insert(heights.begin(), 0); heights.push_back(0); st.push(0); for (int i
阅读全文
摘要:LC503. 下一个更大元素Ⅱ 对于“每日温度”,相当于对nums数组,进行了两次遍历。用i % size所得余数作为下标,且循环的圈数为size * 2 vector<int> nextGreaterElements(vector<int>& nums) { int size = nums.siz
阅读全文
摘要:LC739. 每日温度 vector<int> dailyTemperatures(vector<int>& temperatures) { int size = temperatures.size(); vector<int> result(size, 0); vector<int> sta; s
阅读全文
摘要: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] =
阅读全文

浙公网安备 33010602011771号