題目:算法
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。數組
設計一個算法來計算你所能獲取的最大利潤。你能夠儘量地完成更多的交易(屢次買賣一支股票)。閉包
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉以前的股票)。函數
示例 1:設計
輸入: [7,1,5,3,6,4] 輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。code
隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能得到利潤 = 6-3 = 3 。
示例 2:it
輸入: [1,2,3,4,5] 輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。co
注意你不能在第 1 天和第 2 天接連購買股票,以後再將它們賣出。 由於這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉以前的股票。
示例 3:分割
輸入: [7,6,4,3,1] 輸出: 0
解釋: 在這種狀況下, 沒有交易完成, 因此最大利潤爲 0。return
思路:連續升序的幾天,在第一天買入,最後一天賣出,將序列分割成若干不重疊的個升序的子序列,對每個子序列求賣出-買入之和
1.普通解法
func maxProfit(prices []int) int { var maxProfit,i int i = 1 for i<len(prices){ var max int for j:=i; i < len(prices) && prices[i] > prices[i-1]; i++ { max = prices[i] - prices[j-1] } i++ maxProfit +=max } return maxProfit }
2.閉包解法
func maxProfit(prices []int) int { f:=f(prices) for { if ok,v:=f();!ok{ return v } } } // 閉包函數,控制maxProfit func f(prices []int)func()(bool,int){ var maxProfit,i int i = 1 return func()(bool,int) { var max int for j:=i; i < len(prices) && prices[i] > prices[i-1]; i++ { max = prices[i] - prices[j-1] } i++ maxProfit +=max if i<len(prices){ return true,maxProfit } return false,maxProfit } }