描述:输入n个数据R, 计算 R[j]-R[i] 的最大值( i从0到n-1,i < j )并输出最大值。
限制:1. 2<=n<=200000
2. 1<=R[i]<=1e9
具体应用:证券投资回测收益,实验数据坐标图分析差值.....
注意点:1. 必须是后面的 R[j] 减去前面的 R[i]。
2. 最大值的初始值必须要小。
思路一:双层循环,内层j,外层i,用maxv变量存储R[j]-R[i]的值。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,maxv = -2e9,minv;//也可以把max设置为R[1]-R[0],这里的-2e9设置为最小的差值
int R[200000];
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> R[i];
}
for (int i = 0; i < n; i++)
{
int j = 1 + i;//保证每次内层循环完一遍,j比i大
for (; j < n; j++)
{
maxv = max(maxv, R[j] - R[i]);//双层循环中,一般内层的数据在前面
}
}
return 0;
}
优点:比较容易想到。
缺点:复杂度为O(N*N),运算过多。
思路二:由于小的数值在前面,大的数值在后面,所以实时记录最小值minv。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n = 0, maxv = -2000000000;
int R[200000];
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> R[i];
}
int minv = R[0];
for (int i = 1; i < n; i++)
{
maxv = max(maxv,R[i]-minv);
minv = min(minv, R[i]);
}
cout << maxv << endl;
return 0;
}
优点:复杂度为O(n)