问题是这样的,假设有一只股票a,a[1...n]代表股票a在第1到第n天所对应的股价,试找到一对值i,j,满足1<=i<=j<=n,且a[j]-a[i]取得最大值。如下表
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
a | 2 | 7 | 1 | 8 | 2 | 8 | 4 | 5 | 9 | 0 | 4 | 5 |
对于a[1...n],最大正收益并非总可以得到,例如a[1...9]={9,8,7,6,5,4,3,2,1},或者a[9]={0,0,0,0,0,0,0,0,0},对于这样的行情,你在任何不同的两天,进行买入和卖出操作,所得到的都是负收益,或者0,对于此种情况,我们允许i=j,也就是买进的当天卖出,但是不允许i>j的情况出现,也就是先买入,然后才能卖出。下面我就给出这个问题的几个解法。
穷举法
最容易想到的就是该方法,通过穷举a[1...n]中所有天数组和(i,j)(1<=i<=n,i<=j<=n),分别计算a[j]-a[i]的值,所有结果中的最大者,就是最终结果。由于要穷举n个数据的2组和,所以整个算法的时间复杂度为O(n^2)。代码如下
int SingleSellProfit(const int array[], size_t array