摘要:題目要求有一個(gè)整數(shù)數(shù)組,每一位上的值代表那一天的股票價(jià)格?,F(xiàn)在假設(shè)最多能夠進(jìn)行次交易,問(wèn)最大的收入是多少思路和代碼這里采用了動(dòng)態(tài)編程的思想。
題目要求
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).
有一個(gè)整數(shù)數(shù)組,每一位上的值代表那一天的股票價(jià)格?,F(xiàn)在假設(shè)最多能夠進(jìn)行k次交易,問(wèn)最大的收入是多少?
思路和代碼這里采用了動(dòng)態(tài)編程的思想。假設(shè)我們希望得到第j天最多進(jìn)行i次交易的最大利潤(rùn),我們首先想到的是,可以通過(guò)比較第j-1天最多進(jìn)行i次交易的利潤(rùn),以及第j-1天進(jìn)行i-1次交易然后最后一次交易為賣(mài)出當(dāng)天的股票所帶來(lái)的利潤(rùn)。
但是這里存在一個(gè)問(wèn)題,也就是說(shuō),如果第j-1天進(jìn)行的第i-1次交易剛好為賣(mài)出第j-1天的股票,而我們不能在這個(gè)數(shù)據(jù)上直接加上在第j天出售股票所獲得的利潤(rùn),因?yàn)槲覀冊(cè)趈-1天根本就沒(méi)有購(gòu)入股票!所以我們需要在j-1天進(jìn)行i-1次交易獲得最大利潤(rùn)的基礎(chǔ)上減去第j天的股票代表我們買(mǎi)入了第j天的股票,從而用于下一輪的計(jì)算。
public int maxProfit(int k, int[] prices) { int len = prices.length; if (k >= len / 2) return quickSolve(prices); int[][] t = new int[k + 1][len]; for (int i = 1; i <= k; i++) { int tmpMax = -prices[0]; for (int j = 1; j < len; j++) { t[i][j] = Math.max(t[i][j - 1], prices[j] + tmpMax); tmpMax = Math.max(tmpMax, t[i - 1][j - 1] - prices[j]); } } return t[k][len - 1]; } private int quickSolve(int[] prices) { int len = prices.length, profit = 0; for (int i = 1; i < len; i++) // as long as there is a price gap, we gain a profit. if (prices[i] > prices[i - 1]) profit += prices[i] - prices[i - 1]; return profit; }
想要了解更多開(kāi)發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68551.html
摘要:雙指針?lè)◤?fù)雜度時(shí)間空間思路根據(jù)買(mǎi)賣(mài)股票的特性,我們必須先低價(jià)買(mǎi),再高價(jià)賣(mài),這個(gè)找最大收益的過(guò)程實(shí)際上是找到目前為之的最低價(jià)。我們可以利用這個(gè)之前計(jì)算的結(jié)果降低時(shí)間復(fù)雜度不過(guò)代價(jià)是額外空間,所以需要把到的最大收益存在數(shù)組中。 Best Time to Buy and Sell Stock I Say you have an array for which the ith element...
摘要:分析因?yàn)楫?dāng)前日期買(mǎi)賣(mài)股票會(huì)受到之前日期買(mǎi)賣(mài)股票行為的影響,首先考慮到用解決。所以我們可以用兩個(gè)數(shù)組分別記錄當(dāng)前持股跟未持股的狀態(tài)。 Best Time to Buy and Sell Stock with Cooldown Say you have an array for which the ith element is the price of a given stock on ...
摘要:示例輸入輸出解釋對(duì)應(yīng)的交易狀態(tài)為買(mǎi)入賣(mài)出冷凍期買(mǎi)入賣(mài)出思路這道題使用動(dòng)態(tài)規(guī)劃。狀態(tài)表示當(dāng)天休息能夠獲得的最大價(jià)值,表示當(dāng)天持有股票能夠獲得的最大價(jià)值,表示當(dāng)天持有股票能夠獲得的最大價(jià)值。 Description Say you have an array for which the ith element is the price of a given stock on day i. ...
摘要:關(guān)鍵字,,算法,,動(dòng)態(tài)規(guī)劃,上關(guān)于主題的題目有四個(gè)這四個(gè)題目難度依次遞增。其中第四個(gè)問(wèn)題是尋求一個(gè)通解,在給定和最大買(mǎi)賣(mài)次數(shù)的情況下,求最大收益。首先大致的解題方向是動(dòng)態(tài)規(guī)劃,這個(gè)應(yīng)該不難想到。之后就是怎么找到狀態(tài),怎么列狀態(tài)轉(zhuǎn)移方程。 關(guān)鍵字:leetcode,Best Time To Buy And Sell Stock,算法,algorithm,動(dòng)態(tài)規(guī)劃,dynamic prog...
摘要:求可能的最大利潤(rùn)題目給了兩個(gè)例子最大利潤(rùn)就是進(jìn)價(jià)為,賣(mài)價(jià)為的時(shí)候,利潤(rùn)為在這個(gè)案例中,進(jìn)價(jià)一直高于售價(jià),所以無(wú)法成交,返回。主要注意一下,先買(mǎi)入才能賣(mài)出賣(mài)價(jià)一定要比買(mǎi)入價(jià)格高才能成交就可以了。 題目詳情 Say you have an array for which the ith element is the price of a given stock on day i.If yo...
閱讀 2267·2021-09-26 09:55
閱讀 3600·2021-09-23 11:22
閱讀 2163·2019-08-30 15:54
閱讀 1908·2019-08-28 18:03
閱讀 2605·2019-08-26 12:22
閱讀 3438·2019-08-26 12:20
閱讀 1735·2019-08-26 11:56
閱讀 2257·2019-08-23 15:30