回到昨天,你能够从股市赚到最多的钱么?
Q:假设你可以回到昨天,并且得到股市昨天的全天每个时刻的数据,你能够通过买卖交易,赚取最多的钱么?
比如:
1. {10, 20, 15, 18, 22, 20, 4, 5}
{买入 卖出}
{10, 20} {15, 22} {4, 5} 一共三次交易,赚了 10 + 7 + 1 = 18块钱
2. {5, 10, 9, 10, 11, 11, 12, 100}
{5, 10} {9, 100} 两次交易,赚了 5 + 91 = 96,是最多的钱。
条件:
1. 不计手续费
2. 一次买+卖算一次完整交易
3. 买入后,在卖出前,不能再买入(意思是,交易不能交叉)
问题:
1. 如果没有其它限制,只让你尽可能多的赚钱,怎么写算法?
2. 扩展问题, 如果规定了,最多只允许交易 N 次,如何买入/卖出,赚最多的钱?
答:
1. 这个比较简单,就好像我的举例一样。直接扫描整个数组,递增就继续扫描,碰到 a[i] < a[i - 1],则将前面的卖掉,然后重新开始买入。以此类推
2. 但这个扩展就比较麻烦了,最多只允许交易N次。
比如例子1中,需要通过三次交易才能够达到收益最大化,但如果N=2,只允许最多交易两次,如何最大化收益呢?算法如何写?
我有个想法,先按问题1中,算出一共交易多少次,能够收益最大。再对这些交易的收益排序(倒序),选收益最多的N个交易,不知道这样行不行?(但总觉得这样可能有问题)