题目:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
理解题目:
因为我们要获得最大利益,就是在一个数组里找到一个最小值和一个最大值,并且最大值是在最小值的后面,然后最大值和最小值的差就是获得 的最大利益。
先用一个数组diff
用于存储相邻元素之间的差。
那么这个问题就转换成找出一个数组中连续子序列的最大值!
找数组中连续子序列的最大值,则如果遇到是>0的元素则加起来,遇到小于 0的元素就停止。
代码如下:
public int maxProfit(int[] prices) {
int length=prices.length;
//数组中没有元素或只有一个元素,利润只能是0
if(length==0||length==1)
return 0;
//用diff存储相邻两个元素之间的差
int[] diff=new int[length-1];
for(int i=0;i<length-1;i++)
{
diff[i]=prices[i+1]-prices[i];
}
//寻找最大子序列和
int maxdiff=diff[0];
for(int i=1;i<length-1;i++)
{
if(diff[i-1]>0)
diff[i]+=diff[i-1];
if(diff[i]>maxdiff)
maxdiff=diff[i];
}
//如果最大子序列和小于0,说明无论怎么买都会亏本,那不买的时候利润就是最大的
if(maxdiff<0)
return 0;
return maxdiff;
}