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的主要特点和优势...
leetcode卡 leetcode exercises 3-5 solutions everyday. fighting~ TODO array Best Time to Buy and Sell Stock II Valid Sudoku linked list Palindrome linked list Linked List Cycle trees Convert Sorted ...
圆和椭圆重叠leetcode ——#158 尖端 关心特殊情况 从不同的方向思考 简单的 大批 1.Two Sum -> 使用哈希表避免遍历列表448.查找数组中消失的所有数字-> 1.建立缓冲区来计算数字| 2.使用数组作为带符号的缓冲区118....
Best Time To Buy And Sell Stock [Binary Tree](Basic-Knowledge/Binary tree.md) Serialize And Deserialize Bit 1.position 2.sequence Sell Stock 区间型 矩阵坐标 Word Ladder Add Two Numbers Matrix Spiral ...
leetcode添加元素使和等于 LeetCodeNotes Array: 4. Median of Two Sorted Arrays 思路: 基于二分查找的思想 88. Merge Sorted Array 描述:合并两个有序数组,将B合并入A,A长度刚好为A.length + B.length nums1 =...
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算法 欢迎提出任何问题和建议! 本人博客: 邮 箱 :
leetcode题库 本仓库存放着刷算法题目的记录 目录结构说明 —notes: 学习和练习算法时留下的笔记 —solution: 解题时写的代码 |——leetcode: LeetCode上的题目 |——codinginterviews: 剑指offer上的题目 |——...
Repo——LeetCode_Python(还没创建),这个主要为面试作准备,可能会进行算法上的训练。 由于我比较穷,没钱开vip,只能做一些比较基础的题目qwq。 联系方式 Blog: Email: GitHub: 目前解题进度 基础练习( 16 / 34...
Best_Time_To_Buy_And_Sell_Stocks_1 Best_Time_To_Buy_And_Sell_Stocks_2 Best_Time_To_Buy_And_Sell_Stocks_3 bst_Iterator 糖果 Character_Precedence Clone_Graph 组合_总和 Counting_Carry_Digits 平等的 First...
11. **Best Time to Buy and Sell Stock**:股票交易的最佳时机。这通常涉及动态规划或简单的贪婪算法,以确定最佳买入和卖出时间。 12. **Lowest Common Ancestor of a Binary Search Tree**:二叉搜索树的最近...
- “Largest BST Subtree(最大的二叉搜索树子树)”和“Best Time to Buy and Sell Stock(买卖股票的最佳时机)”考查动态规划。 - “Merge k Sorted Lists(合并 k 个排序列表)”是链表操作的高级题目。 - ...
* Best Time to Buy and Sell Stock:给定一个数组,返回股票买卖的最佳时机。这个题目需要使用动态规划的思想,将数组分解成更小的子数组,并找到最佳时机。 * Unique Paths:给定一个矩形,返回从左上角到右下角的...
在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目——LeetCode的第47题“全排列II”。这道题目属于经典的回溯法(Backtracking)问题,主要考察程序员对数组操作、组合优化以及算法设计的能力。在求职...
本资源——"leetcode100-Algorithms_and_solutions:Codility和LeetCode算法问题的解决方案汇编"——是针对算法学习者的宝贵资料,特别是那些使用Python3编程语言的人。它汇集了100个算法问题,涵盖了 Codility 和 ...