![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
程程程乘什么
这个作者很懒,什么都没留下…
展开
-
股票买卖 6题:
121-只允许买卖一次n * 2 空间的dp表:class Solution {public: int maxProfit(vector<int>& prices) { const int n = prices.size(); if (n == 0) return 0; // 初始化第0天的情况 vector<vector<int>> dp(n, vector<int>原创 2020-07-27 02:10:01 · 263 阅读 · 0 评论 -
面试题14:剪绳子
14-1:DP做法,思路比较好class Solution {public: int cuttingRope(int n) { if(n <= 1) return 0; vector<int> dp(n+1, 1); for(int i = 2; i <= n;...原创 2020-03-27 16:56:50 · 142 阅读 · 0 评论 -
回文串/回文序列系列题:647回文子串个数/ 5最长回文子串/ 516最长回文子序列
647. 回文子串:计数字符串中回文子串的个数1、中心延展法:中心可以取为字母,或两个字母的间隙。class Solution {public: int countSubstrings(string s) { const int n = s.length(); int ans = 0; for(int i = 0; i < ...原创 2020-03-26 23:25:59 · 215 阅读 · 0 评论 -
贪心算法系列:435 无重叠区间 452 用最少数量的箭引爆气球
参考:https://labuladong.gitbook.io/algo/dong-tai-gui-hua-xi-lie/tan-xin-suan-fa-zhi-qu-jian-tiao-du-wen-ti贪心算法求解区间调度问题: 正确的思路其实很简单,可以分为以下三步: 从区间集合 intvs 中选择一个区间 x,这个 x 是在当前所有区间中结束最早的(end 最小)。...原创 2020-03-23 17:26:48 · 151 阅读 · 0 评论 -
LeetCode : 股票买卖进阶4道题
123:限制买卖次数为2Bug:变量命名用的不好引起了低级错误!不要用k表示常亮,容易在之后写错。class Solution {public: int maxProfit(vector<int>& prices) { const int n = prices.size(); if(n <= 1) return 0;...原创 2020-03-21 11:47:48 · 211 阅读 · 0 评论 -
LeetCode :95/96 不同的二叉搜索树 (二叉搜索树组合的个数)
参考力扣上官方的题解,采用动态规划法,关键点在于:1、状态转移公式的推导;2、边界的处理:dp[0]也初始化为1,因为+=的存在,dp除0,1之外,后面的都要初始化为0class Solution {public: int numTrees(int n) { if(n <= 1) return n; vector<int>...原创 2020-02-28 21:44:57 · 193 阅读 · 0 评论 -
LeetCode:1143 最长公共子序列 583 两个字符串的删除操作
因为处理边界的不方便,自己想出了用Padding技巧来做,注意在 if 语句中 i, j 要减一class Solution {public: int longestCommonSubsequence(string text1, string text2) { int m = text1.length(), n = text2.length(); ...原创 2020-02-27 22:32:49 · 178 阅读 · 0 评论 -
LeetCode:5 最长回文子串
这道题与516题有一定的相似,只是一个是回文子序列,返回的是长度。一个是回文子串,返回的是字符串。一个比较好的解法汇总:动态规划、Manacher 算法一开始看了别人的思路,但是自己怎么写都不通过,后来发现原因在于:dp[i][j] = len==1 || len==2 || dp[i+1][j-1] && (s[i] == s[j]); 没有加括号,导致的后果:...原创 2020-02-27 17:51:36 · 100 阅读 · 0 评论 -
LeetCode:516 最长回文子序列
典型的动态规划题,可以用递归、迭代两种形式来解。首先引用一篇讲子序列问题的好文章:子序列问题通用思路|最长回文子序列以下内容引自上文:子序列问题是常见的算法问题,而且并不好解决。首先,子序列问题本身就相对子串、子数组更困难一些,因为前者是不连续的序列,而后两者是连续的,就算穷举你都不一定会,更别说求解相关的算法问题了。而且,子序列问题很可能涉及到两个字符串,比如前文「最长...原创 2020-02-27 22:53:08 · 155 阅读 · 0 评论 -
LeetCode 198:打家劫舍
简单的DP问题,因为状态转移方程仅仅和当前元素的前几个节点有关,因此不需要维护一个dp一维数组,和跳台阶问题一样,仅仅需要维护几个元素即可。class Solution {public: int rob(vector<int>& nums) { if(nums.empty()) return 0; int n...原创 2020-02-26 17:25:00 · 99 阅读 · 0 评论 -
LeetCode:300 最长上升子序列 (最优方法是:动态规划 + 二分法)
第一种简单粗暴地解法:递归求解状态转移方程,属于Up-Down方法,因为子问题的重复求解,导致时间复杂度O(2^n)一个语法点:想用全局变量,可以直接设置类的成员变量,不应该像 java 那样用 static 静态变量!这一点很容易被忽视!class Solution {private: int max; int f(vector<int>&a...原创 2020-02-26 16:08:37 · 209 阅读 · 1 评论 -
LeetCode: 91 解码方法
这道题一开始以为是简单的递归问题,按照从前往后的顺序递归,总是在“10”这个输入上报错。按照从后向前的方法递归,应对短序列没有问题,但是面对长序列,因为存在大量重复计算,所以超时。如果用递归来做,应该用记忆化递归!class Solution {public: int numDecodings(string s) { //if(s == "0" || s =...原创 2020-02-27 23:59:08 · 773 阅读 · 0 评论 -
LeetCode 140:单词拆分 Ⅱ
每次求解子串s的解集时,单独定义一个ans看上去可读性更好,但是试了一下不用ans直接更新mem_,反而速度更快!(我的程序写法更简洁,比huahua的程序简洁一些)class Solution {public: vector<string> wordBreak(string s, vector<string>& wordDict) { ...原创 2019-10-26 11:39:39 · 100 阅读 · 0 评论 -
LeetCode 139:单词拆分
方法一:循环递推的方式class Solution {public: bool wordBreak(string s, vector<string>& wordDict) { unordered_set<string> dict(wordDict.cbegin(), wordDict.cend()); int n =...原创 2019-10-25 23:28:45 · 87 阅读 · 0 评论 -
LeetCode 72:编辑距离
一维动态规划:爬楼梯二维动态规划:编辑距离第一次根据思路写程序,在字符串如何切片,取[1:]被卡住了:class Solution {public: int minDistance(string word1, string word2) { }private: int minDistanceRecu(string word1, str...原创 2020-04-07 15:52:50 · 107 阅读 · 0 评论 -
LeetCode 70:爬楼梯
这道题可以说是动态规划里最最基础的题目了,剑指Offer中的青蛙跳台阶也是这样的题目。循环的写法:class Solution {public: int climbStairs(int n) { vector<int> f(n); //数组记录爬到每一级台阶的方法数 if(n==1) return 1; f[0] ...原创 2019-10-24 21:58:21 · 192 阅读 · 0 评论 -
LeetCode 122:买卖股票的最佳时间Ⅱ
方法一:贪心算法,只要第二天比前一天高,就前一天买入,第二天卖出 int maxProfit(vector<int>& prices) { const int n = prices.size(); //if(n<=1) return 0; int profit = 0; for(int i=1...原创 2019-10-21 22:51:18 · 114 阅读 · 0 评论 -
LeetCode 121:买卖股票的最佳时间
动态规划可解: 状态方程 + 初始状态,为了更直观的体现状态机,可以把到第 i 天为止的最小价格和到第 i 天能获得的最大收益保存为数组,当然完全可以保存为一个变量的。时间复杂度O(n),空间复杂度O(n)/O(1) int maxProfit(vector<int>& prices) { const int n = prices.size(); ...原创 2019-10-21 21:30:06 · 124 阅读 · 0 评论