class Solution { public: Solution(){} int maxProfit(int K, vector<int> &prices) { vector<int> lowVec; vector<int > highVec; if(prices.size() <=1){ return 0; } prices.erase(std::unique(prices.begin(),prices.end()),prices.end()); if(prices.size() <=1){ return 0; } lowVec.reserve(prices.size()/2); highVec.reserve(prices.size()/2); if(prices[0]<prices[1]){ lowVec.push_back(prices[0]); } for(int i=1;i<prices.size()-1;i++){ int low; int cur = prices[i]; if(cur<prices[i+1] && cur<prices[i-1]){ lowVec.push_back(cur); } if(cur>prices[i-1]&&cur>prices[i+1]){ highVec.push_back(cur); } } if(prices[prices.size()-2]<prices[prices.size()-1]){ highVec.push_back(prices.back()); } int N = lowVec.size(); if(K>=N){ int sum=0; for(int i=0;i<N;i++){ sum += highVec[i]-lowVec[i]; } return sum; } vector<vector<int> > opt ; opt.resize(K+1); for(int i=0;i<K+1;i++) { opt[i].resize(N); } vector<int>diff; diff.reserve(lowVec.size()); int sum=0; for(int i=0;i<N;i++){ sum += (highVec[i]-lowVec[i]); diff.push_back(sum); } for(int k=1;k<=K;k++) { for(int i=0;i<k;i++){ opt[k][i]= diff[i]; } } for(int i=0;i<N;i++){ opt[0][i]=0; } for(int k=1;k<=K;k++) { for(int i=k;i<N;i++) { opt[k][i] = max(opt[k][i-1],opt[k-1][i-1]+highVec[i]-lowVec[i]); opt[k][i] = max(opt[k][i],highVec[i]-lowVec[0]); for(int t=i-1;t>=k-1 && t>0;t--){ int highDiff = highVec[i]-highVec[t]; int lowDiff = lowVec[i]-lowVec[t]; if(highDiff>0 && lowDiff>0){ opt[k][i]=max(opt[k][i],opt[k-1][t-1]+highVec[i]-lowVec[t]) ; } else break; } } } return opt[K][N-1]; } };
188 | Best Time to Buy and Sell Stock IV |
说明:有个地方不同其他程序。即先删除一些无用的状态(即非波峰波谷,这些状态属于中间态,因此,肯定赚钱不了的),比如 {2,3,4,3,2}其中的3就是无用状态。对于最后一个元素,如果不是涨价,也是无用,第一个元素,如果不比第二个元素小,也是无效状态
动态规划的主要公式:
opt[k][i]=max(opt[k][i],opt[k-1][t-1]+highVec[i]-lowVec[t])
即,如果选择当前第i个股价卖出,那么,需要选取第t个股价买入(0<=t<i),同时在t前面选择k-1个操作即opt[k-1][t-1]
相关推荐
- Best Time to Buy and Sell Stock IV:与前三者不同,可能需要多次买入和卖出。 - Best Time to Buy and Sell Stock with Cooldown:买卖后需要冷却一天。 - Best Time to Buy and Sell Stock with Transaction...
Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...
python python_leetcode题解之122_Best_Time_to_Buy_and_Sell_Stock_II
圆和椭圆重叠leetcode ——#158 尖端 关心特殊情况 从不同的方向思考 简单的 大批 1.Two Sum -> 使用哈希表避免遍历列表448.查找数组中消失的所有数字-> 1.建立缓冲区来计算数字| 2.使用数组作为带符号的缓冲区118....
7. **122.py** - 可能是LeetCode的122题,"Best Time to Buy and Sell Stock II"(买卖股票的最佳时机II),这是一道关于动态规划或贪心策略的题目,用于找出股票交易的最佳策略。 8. **156.py** - 这可能是...
3. **Best Time to Buy and Sell Stock II**:这是一个经典的动态规划问题,用于找出股票的最佳买卖时机,可以连续多次买卖。理解状态转移方程和动态规划的原理至关重要。 4. **Jump Game II**:此问题涉及到广度...
为了方便开发者更高效地进行刷题,LeetCode 提供了官方编辑器插件——LeetCode Editor,本次我们关注的是它的7.4版本。这个版本的插件可以极大地简化我们在 IDEA 开发环境中使用 LeetCode 的流程,无需繁琐的配置,...
leetcode csdn Leetcode Leetcode题解(C++版),代码 + 详细博客说明 ! 所有内容见博客专栏:小题大做——Leetcode算法 欢迎提出任何问题和建议! 本人博客: 邮 箱 :
Repo——LeetCode_Python(还没创建),这个主要为面试作准备,可能会进行算法上的训练。 由于我比较穷,没钱开vip,只能做一些比较基础的题目qwq。 联系方式 Blog: Email: GitHub: 目前解题进度 基础练习( 16 / 34...
11. **Best Time to Buy and Sell Stock**:股票交易的最佳时机。这通常涉及动态规划或简单的贪婪算法,以确定最佳买入和卖出时间。 12. **Lowest Common Ancestor of a Binary Search Tree**:二叉搜索树的最近...
这里我们关注的是一个基于Swift语言的LeetCode解决方案集——LeetCode.swift.zip,它是一个开源项目,旨在为Swift开发者提供一套完整的LeetCode问题解答。 首先,Swift是一种由Apple开发的开源编程语言,设计时考虑...
在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目——LeetCode的第47题“全排列II”。这道题目属于经典的回溯法(Backtracking)问题,主要考察程序员对数组操作、组合优化以及算法设计的能力。在求职...
本资源——"leetcode100-Algorithms_and_solutions:Codility和LeetCode算法问题的解决方案汇编"——是针对算法学习者的宝贵资料,特别是那些使用Python3编程语言的人。它汇集了100个算法问题,涵盖了 Codility 和 ...
Leetcode原题Count and Say count-and-say序列是整数序列,前五个术语如下: 1. 1 2. 11 3. 21 1211 5. 111221 1被读作“1”或11。 11被读作“两个1”或21。 21被读作“一个2,然后一个1”或1211。 给定整数n,...
在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目——LeetCode的第305题,名为“岛屿数量II”。这是一道典型的图论问题,涉及到深度优先搜索(DFS)或广度优先搜索(BFS)的解决策略。在面试中,这类...
LeetCode book——CleanCodeHandbook_v1.0.1
今天要介绍的这份宝贵的资源——《Leetcode算法刷题笔记》,涵盖了Java、C++、Go三种主流语言,助你在编码之旅中披荆斩棘,领略算法的魅力。 此笔记不仅精心挑选了Leetcode中的高频面试题目,还针对每种语言提供了...