题目描述:
风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。
给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。
假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。
设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100
示例1
输入 3,8,5,1,7,8
输出 12
看这道题时我的目标是只扫描数组一次。下面是思路和代码:
2个int(imin ,imax)保存极小值和极大值的下标,3个int:aEarn,bEarn保存两次交易赚的钱,tEarn暂时保存本次交易赚的钱之后放入aEarn,bEarn或舍弃。
一个循环得到极小值下标,一个循环得到极大值下标。
最终数组只扫描一次。
#include <stdio.h>
int main (){
int p[10];
int i;
int sum;
for (i = 0; i < 10; i++) {
p[i]=10-i;
}
for(i=0 ; i<10; i++) printf("%d ",p[i]);
printf("\n");
sum = earn(p,10);
printf("%d",sum);
return 0;
}
int earn (int* price ,int n)
{
int aEarn = 0, bEarn = 0, all = 0;
int tEarn;
int imin,imax;
int i;
for (i=0; i < n-1;) {
for(imin=i; i<n && price[imin] >= price[i]; i++) { //波谷下标放在imin
imin = i;
}
i = imin;
for(imax=i; i<n && price[imax] <= price[i]; i++) { //波峰下标放在imax
imax = i;
}
i = imax;
tEarn = price[imax] - price[imin]; //这次交易赚的钱暂时放在tEarn
if(tEarn > all/2) { //这次交易赚的钱放到aEarn和bEarn中较小的中
if(aEarn > bEarn) {
bEarn = tEarn;
}else {
aEarn = tEarn;
}
}
all = aEarn + bEarn;
}
return all;
}