Best Time to Buy and Sell Stock系列

一、数组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) 因为只遍历了一次

空间复杂度还是常数

有两种写法:

直观法:

Best Time to Buy and Sell Stock系列_第1张图片

巧妙法:Kadane's Algorithm  算是一种简单的动态规划

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

遇到比当前最大利润买入股价要小的,就从这天买入计算最大利润,最后进行比较。

Best Time to Buy and Sell Stock系列_第2张图片

二、可以买卖多次,求最大利润。

思路:只要后者大于前者,就可以进行一次买卖。同一天可以同时买卖。

复杂度分析:

时间复杂度,O(N) 

空间复杂度,O(1)

Best Time to Buy and Sell Stock系列_第3张图片

三、只能进行两次买卖 还是动态规划  k次交易 令k=2

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

时间复杂度:2N ,O(N) 

空间复杂度:O(1)

Best Time to Buy and Sell Stock系列_第4张图片

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

四、只能k次  但是用以上方法,内存出错 

空间复杂度 O(N)

Best Time to Buy and Sell Stock系列_第5张图片

Best Time to Buy and Sell Stock系列_第6张图片

五、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)

Best Time to Buy and Sell Stock系列_第7张图片

可以优化空间复杂度,因为sell,只与前一个有关,buy只与前两个有关。

Best Time to Buy and Sell Stock系列_第8张图片

六、每次卖要给交易费

在二的基础上增的限制,是多次交易减去交易费,但是用二的做法,并不能知道交易多少次。

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

Best Time to Buy and Sell Stock系列_第9张图片

你可能感兴趣的:(笔记)