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 浇花力扣解决方案 简单的 #0001 - Two Sum #0007 - Reverse Integer #0009 - Palindrome Number #0035 - Search Insert Position #0058 - Length of Last Word #0066 - Plus One #0083 - Remove Duplicates...
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小岛出水口 leetcode training one problem on file 为了方便文档管理,项目逐渐文档化,以单个文件作为集合最小集。 go语言不能完全适合写算法题 后续会尽可能加入rust或者c的题解 清单 0965. Univalued ...
圆和椭圆重叠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算法 欢迎提出任何问题和建议! 本人博客: 邮 箱 :
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 个排序列表)”是链表操作的高级题目。 - ...
这里我们关注的是一个基于Swift语言的LeetCode解决方案集——LeetCode.swift.zip,它是一个开源项目,旨在为Swift开发者提供一套完整的LeetCode问题解答。 首先,Swift是一种由Apple开发的开源编程语言,设计时考虑...
在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目——LeetCode的第47题“全排列II”。这道题目属于经典的回溯法(Backtracking)问题,主要考察程序员对数组操作、组合优化以及算法设计的能力。在求职...