股票最大收益問題
給定一個數組,它的第 i個元素是一支給定股票第i天的價格。 設計一個算法來計算你所能獲取的最大利潤。你能夠儘量地完成更多的交易(屢次買賣一支股票)。算法
注意: 你不能同時參與多筆交易(你必須在再次購買前出售掉以前的股票)。 測試用例:數組
輸入: [7,1,5,3,6,4] 輸出: 7 解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。 隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能得到利潤 = 6-3 = 3 。 複製代碼複製代碼
輸入: [7,6,4,3,1] 輸出: 0 解釋: 在這種狀況下, 沒有交易完成, 因此最大利潤爲 0。 複製代碼複製代碼
解決方案1 :時間複雜度 o(n^2) 解題思路:bash
1 思考好兩個時機便可,什麼時間會買入,什麼時間會賣出post
2 買入:當發現後一個價格比當前價格高,確定會買入測試
3 賣出:當發現買入以後的價格中,存在價格下滑時,在下滑前或者再也不升高前賣出ui
備註:存在屢次交易,因此必然是一直循環 ; 不能同時交易,因此賣出和買入的操做不能同時進行,決定買入的行爲中不會有賣出,賣出的行爲中也絕對沒有買入,致使的代碼邏輯就是指針會加一。spa
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
if(!prices || !prices.length) return 0
let maxProfit = 0
for(let i=0,len=prices.length;i<len;i++){
// 發現以後的價格有提高的時候纔會考慮買入
if(prices[i]<prices[i+1]){
// 循環決定何時會賣出
for(let t=i+1;t<len;t++){
// 當股票價格開始降低或者達到最後一個的時候 是決定賣出了
if(prices[t]>prices[t+1]||t==len-1){
maxProfit += prices[t] - prices[i]
i= t+1
}
}
}
}
return maxProfit
};
複製代碼複製代碼
解決方案二 :動態規劃設計
解決思路:無論是何時買入仍是賣出,其實任何一次的買入和賣出的中間過程均可以當作中間連續買入賣出的疊加。好比m(4)-m(2) = m(4)-m(3)+m(3)-m(2),而最大收益其實就是隻計算那些咱們經過對比相鄰天數得出的正數而後累加上去就是最大收入。3d
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
if(!prices || !prices.length) return 0
let maxProfit = 0
for(let i=0,len=prices.length;i<len;i++){
let ben = prices[i+1] - prices[i]
if(ben>0) maxProfit+= ben
}
return maxProfit
};
複製代碼複製代碼
對比分析:固然,從結果來看方案二更高效,也更容易理解,方案一更符合你們的常規思惟。可是方案二有一個短板就是還須要額外的代碼去判斷何時是買入和賣出的真正節點,雖然這道題沒有這個要求返回方案,但咱們要考慮到這一點。指針