C++實(shí)現(xiàn)LeetCode(188.買賣股票的最佳時(shí)間之四)
[LeetCode] 188.Best Time to Buy and Sell Stock IV 買賣股票的最佳時(shí)間之四
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most k transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.
這道題實(shí)際上是之前那道 Best Time to Buy and Sell Stock III 買股票的最佳時(shí)間之三的一般情況的推廣,還是需要用動(dòng)態(tài)規(guī)劃Dynamic programming來解決,具體思路如下:
這里我們需要兩個(gè)遞推公式來分別更新兩個(gè)變量local和global,我們其實(shí)可以求至少k次交易的最大利潤(rùn)。我們定義local[i][j]為在到達(dá)第i天時(shí)最多可進(jìn)行j次交易并且最后一次交易在最后一天賣出的最大利潤(rùn),此為局部最優(yōu)。然后我們定義global[i][j]為在到達(dá)第i天時(shí)最多可進(jìn)行j次交易的最大利潤(rùn),此為全局最優(yōu)。它們的遞推式為:
local[i][j] = max(global[i - 1][j - 1] + max(diff, 0), local[i - 1][j] + diff)
global[i][j] = max(local[i][j], global[i - 1][j]),
其中局部最優(yōu)值是比較前一天并少交易一次的全局最優(yōu)加上大于0的差值,和前一天的局部最優(yōu)加上差值后相比,兩者之中取較大值,而全局最優(yōu)比較局部最優(yōu)和前一天的全局最優(yōu)。
但這道題還有個(gè)坑,就是如果k的值遠(yuǎn)大于prices的天數(shù),比如k是好幾百萬,而prices的天數(shù)就為若干天的話,上面的DP解法就非常的沒有效率,應(yīng)該直接用Best Time to Buy and Sell Stock II 買股票的最佳時(shí)間之二的方法來求解,所以實(shí)際上這道題是之前的二和三的綜合體,代碼如下:
class Solution { public: int maxProfit(int k, vector<int> &prices) { if (prices.empty()) return 0; if (k >= prices.size()) return solveMaxProfit(prices); int g[k + 1] = {0}; int l[k + 1] = {0}; for (int i = 0; i < prices.size() - 1; ++i) { int diff = prices[i + 1] - prices[i]; for (int j = k; j >= 1; --j) { l[j] = max(g[j - 1] + max(diff, 0), l[j] + diff); g[j] = max(g[j], l[j]); } } return g[k]; } int solveMaxProfit(vector<int> &prices) { int res = 0; for (int i = 1; i < prices.size(); ++i) { if (prices[i] - prices[i - 1] > 0) { res += prices[i] - prices[i - 1]; } } return res; } };
類似題目:
Best Time to Buy and Sell Stock with Cooldown
Best Time to Buy and Sell Stock III
Best Time to Buy and Sell Stock II
Best Time to Buy and Sell Stock
到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(188.買賣股票的最佳時(shí)間之四)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)買賣股票的最佳時(shí)間之四內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(203.移除鏈表元素)
- C++實(shí)現(xiàn)LeetCode(202.快樂數(shù))
- C++實(shí)現(xiàn)LeetCode(201.數(shù)字范圍位相與)
- C++實(shí)現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖)
- C++實(shí)現(xiàn)LeetCode(198.打家劫舍)
- C++實(shí)現(xiàn)LeetCode(190.顛倒二進(jìn)制位)
- C++實(shí)現(xiàn)LeetCode(309.買股票的最佳時(shí)間含冷凍期)
- C++實(shí)現(xiàn)LeetCode(237.刪除鏈表的節(jié)點(diǎn))
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換器
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C語(yǔ)言中關(guān)于動(dòng)態(tài)內(nèi)存分配的詳解
動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。棧上分配的內(nèi)存是由系統(tǒng)分配和釋放的,空間有限,在復(fù)合語(yǔ)句或函數(shù)運(yùn)行結(jié)束后就會(huì)被系統(tǒng)自動(dòng)釋放而堆上分配的內(nèi)存則不會(huì)有這個(gè)問題。2021-09-09C++實(shí)現(xiàn)訪問者模式的基礎(chǔ)介紹
訪問者模式表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。對(duì)C++訪問者模式相關(guān)知識(shí)感興趣的朋友一起看看吧2021-09-09學(xué)生成績(jī)管理系統(tǒng)C++實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了學(xué)生成績(jī)管理系統(tǒng)C++實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12解決c++?error:crosses?initialization?of?問題
最近在寫代碼的時(shí)候,碰到了?crosses?initialization?of?...?的問題,只因我在?switch?的某個(gè)?case?分支下定義了一個(gè)變量,于是乎便將這個(gè)問題整理一下,需要的朋友可以參考下2023-03-03C++實(shí)現(xiàn)LeetCode(55.跳躍游戲)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(55.跳躍游戲),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07