股神告诉你未来n天股票的行情,却只允许你作一次买卖。求解最佳买卖的时机并分析计算复杂度。
第1天:6200
第2天:7000
第3天:4000
第4天:4500
第5天:5300
第6天:3000
第7天:3400
该题最优的时间复杂度是O(n),只遍历一次即可求得结果。
即从从第二天(第一天抛售没有收益)开始,往后遍历,作为抛售时间和抛售价格。同时,求得抛售时间之前的价格最小值,因为抛售时间之前的价格只能作为买入价格。这样两者相减即可求得一个以当前价格卖出去时,所能获得的最大利益。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main() {
int n;//未来n天
while( cin>>n && n) {
long stock[100000] = {0};//数组存储股票行情
int max = 0 ;//最大化收益
int buy = 1;//买入时间
int j = 1;
int sale=0;//卖出时机
int min = 0;//记录扫过的数组中的最小值
for(int i=1; i<=n; i++) {
cin >> stock[i];//每一天的价格
//cout << stock[i]<<endl;
}
min = stock[1];//最开始取第一个值
//开始做处理,复杂度为n
for(int i=2; i<=n; i++) {
int after = stock[i];//抛出时的价格
if(min > stock[i-1]) { //出现了新的最小值
min = stock[i-1];
j = i-1; //买入的时间
}
if(max < stock[i]-min) {
sale = i;
buy = j;
max = stock[i]-min;
}
}
cout << "第"<<buy<<"天买入,第"<<sale<<"天卖出可以赚"<<max<<"元"<<endl;
}
return 0;
}