一、买卖股票的最佳时机——一次买卖机会
给定一个代表股票价格的数组,只能进行一次买卖交易,求所能获取的最大利润。例如
A=[7,1,5,3,6,4]
显然1时买入,6时卖出,利润最大。
数组Am和An,关系为Am=[An,m],令An时,最低买入价为i,最高卖出价为o,最大利润为p=o-i。
若m<i,因为出现了更低的买入价,则更新最低买入价,i=m。
而最高卖出价则要每次都更新,因为需要不断的计算当前的利润来比较最大值。
综上所述,状态转换方程为
An = [An-1, n]
o = n
if(i > n), i = n
p = max(p, o-i)
代码如下
int maxProfit(int* prices, int pricesSize)
{
int in = prices[0];
int profits = 0;
int i = 0;
for(i=1; i<pricesSize; i++)
{
if(prices[i] < in)
in = prices[i];
profits = profits>(prices[i]-in)?profits:prices[i]-in;
}
return profits;
}
二、买卖股票的最佳时机——多次买卖机会
给定一个代表股票价格的数组,进行多次买卖交易,求所能获取的最大利润。
例如,A=[7,1,5,3,6,4],1时买入,5时卖出,3时买入,6时卖出,利润最大。
感觉比上题更简单,只要后面的卖出价高于买入价就交易,然后把利润相加。唯一需要注意的是当卖出后,需要把卖出价记录为新的买入价。
状态转化方程
An = [An-1,n]
if(in > n), in = n
if(in < n), out = n
p += out-in
in = out
代码如下
int maxProfit(int* prices, int pricesSize)
{
int in = prices[0];
int profits = 0;
int i = 0;
for(i=1; i<pricesSize; i++)
{
if(prices[i] > in)
profits += (prices[i]-in);
in = prices[i];
}
return profits;
}