Best Time to Buy and Sell Stock系列

zhangdamengcsdn發表於2018-08-13

一、陣列i位置代表第i天股票的價格,只允許,買一次,賣一次,買賣不可以在同一天,求最大利潤。

思路:第0天買,找比第0天價格高的最多的一天賣出,得到第0天買入的最大利潤;以此類推,得到n-1個最大利潤,求其中的最大值,即滿足題目要求。

這個演算法的複雜度分析:

n-1+n-2+n-3+.....+1=n(n-1)/2  時間複雜度是O(N^2)

空間複雜度為O(1)

必然可以簡化演算法。

記錄當前最小值,用當前值減去最小值,得到的利潤與當前最大利潤比較。

就是如果後者比前者大,那後者肯定不是買入的那一天,也就不用去算那天買入時的最大利潤。

複雜度分析:

時間複雜度O(N) 因為只遍歷了一次

空間複雜度還是常數

有兩種寫法:

直觀法:

巧妙法:Kadane's Algorithm  算是一種簡單的動態規劃

https://en.wikipedia.org/wiki/Maximum_subarray_problem

遇到比當前最大利潤買入股價要小的,就從這天買入計算最大利潤,最後進行比較。

二、可以買賣多次,求最大利潤。

思路:只要後者大於前者,就可以進行一次買賣。同一天可以同時買賣。

複雜度分析:

時間複雜度,O(N) 

空間複雜度,O(1)

三、只能進行兩次買賣 還是動態規劃  k次交易 令k=2

https://blog.csdn.net/linhuanmars/article/details/23236995

時間複雜度:2N ,O(N) 

空間複雜度:O(1)

為什麼要倒序?因為要用到上一天的max_cur[j-1],所以j不能先更新小的

四、只能k次  但是用以上方法,記憶體出錯 

空間複雜度 O(N)

五、Best Time to Buy and Sell Stock with Cooldown

可以進行多次交易,但是這一天賣出去,需要冷靜一天,再進行買賣。

https://soulmachine.gitbooks.io/algorithm-essentials/java/dp/best-time-to-buy-and-sell-stock-with-cooldown.html

其實與二相似,buy 是一天 然後後邊選擇連續兩天,sell+cooldown.

那麼需要維護兩個陣列,

sell【i】第i天手裡沒股票的zui大利潤,今天賣了股票或者,沒動作。

buy[i] 第i天手裡有股票,今天買了股票,或者之前買的,今天不賣。

那sell[i]=max(prices[i]+buy[i-1],sell[i-1])

buy[i]=max(buy[i-1],sell[i-2]-prices[i])

最終手裡沒股票。sell[n-1]

時間複雜度:O(N)

空間複雜度:O(N)

可以優化空間複雜度,因為sell,只與前一個有關,buy只與前兩個有關。

六、每次賣要給交易費

在二的基礎上增的限制,是多次交易減去交易費,但是用二的做法,並不能知道交易多少次。

http://www.cnblogs.com/grandyang/p/7776979.html

相關文章