题意
给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
输入格式
第一行包含整数 N,表示数组长度。
第二行包含 N 个不大于 109 的正整数,表示完整的数组。
输出格式
输出一个整数,表示最大利润。
数据范围
1≤N≤105,
输入样例1:
6
7 1 5 3 6 4
输出样例1:
5
输入样例2:
5
7 6 4 3 1
输出样例2:
0
解题思路
一道经典的贪心问题:求max{ai−aj | j<i}
扫一遍数列,找到维护最小值minv,用ai−minv更新答案即可。
(即找到每个数前面最小的数,再相减)
代码1
#include <iostream>
#include <algorithm>
using namespace std;
const int N=100010;
int main()
{
int n;
cin>>n;
int a[N];
int min=100000000;
int ans=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(min>a[i]) //打擂法求出每个数前面的小的数
{
min=a[i];
}
ans=max(ans,a[i]-min); //相减进行比较求出最大利润
}
cout<<ans;
return 0;
}
代码2
#include <iostream>
#include <algorithm>
using namespace std;
const int N=100010;
int main()
{
int n;
cin>>n;
int a[N];
int minv=100000000;
int ans=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
minv=min(minv,a[i]); //利用min()函数求最小值
ans=max(ans,a[i]-minv);
}
cout<<ans;
return 0;
}
代码3
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int x;
int minx=10000000;
int maxx=0;
while(n--) //利用循环实现
{
cin>>x;
minx=min(minx,x);
maxx=max(maxx,x-minx);
}
cout<<maxx;
return 0;
}