题目要求s[i] - s[j] ;( i< j)的最大值;
而对于每一个s[j], 对应的最大值就是max(s[i]) - s[j] ;( i < j);
所以我们从头开始遍历max(s[i]) - s[j],并且时时更新max[s[i]];
这样题目便只要O(n)便足够了
#include <stdio.h>
#include <algorithm>
const int maxn = 100000+10;
int tcase, n, mbefore, mdif;
int digit[maxn];
int main()
{
scanf("%d", &tcase);
while(tcase--)
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &digit[i]);
mdif = digit[0] - digit[1];
mbefore = std::max(digit[0], digit[1]);
for(int i = 2; i < n; i++)
{
mdif = std::max(mdif, mbefore - digit[i]);
mbefore = std::max(mbefore, digit[i]);//更新i之前的最大值
}
printf("%d\n", mdif);
}
return 0;
}