目录
1.题目
题目来源:牛客网
2.题意
题目的意思是让我们找的最大值,且(0<i<j<a.size)。因为题目要求i的下标要比j小,这就意味着我们要先找到一个比较小的值记为,然后在下标i后的区域找一个最大值,当找到一个比更小的值时,让获得一个在当前后的区域相减的最大差值,然后更新并重复前面的过程。(更新的原因是,在找到1个比更小的值b后,在b后面区域中的最大值与进行相减一定不如的差值大,而题目需要求最大差值,所以需要更新)。
3.代码思路
a:用于存储当前输入到数组的数。
mi:存储当前区域的最小值。
ma:存储当前区域的最大值。
b:用于存储上一个mi的值。
ans:存储相减获得的差值。
在输入完组数和数组长度后,将输入到数组的对应的元素存入a,将mi值更新。若a的值与mi值相等,说明mi值被更新,进入了一个新的区域,需要将ans和最大值ma-b进行比较并更新ans,然后再将ma初始化,再将当前的mi存入b进行保存.若a值与mi值不相等则不用进行上述操作。再然后更新ma,反复循环直至数组元素全部输入完成。在跳出输入的循环后,在进行一次ans和ma-b比较并更新ans.(a==mi时,进入新区域,进行更新,若退出时没有进入新区域,则需要在退出后手动更新一次).判断ans是否等于0,若不相等则说明有最大差值,直接输出.否则按题目要求输出-1( 因为,所以当无最大差值时ans=0)。
4.代码实现
#include<iostream>
#include<cstdio>
using namespace std;
const int Mi=0x3f3f3f3f,Ma=-100000;
int main()
{
int T;
cin >>T;
while(T--)
{
int n;
cin >>n;
int a,b;
int mi=Mi,ma=Ma,ans=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
mi=min(mi,a);
if(a==mi) ans=max(ans,ma-b),ma=Ma,b=mi;///更新ans,初始化ma,b更新为当前mi
ma=max(ma,a);
}
ans=max(ans,ma-b);///手动更新
if(ans==0)
{
cout <<-1 <<endl;
}
else
{
cout <<ans <<endl;
}
}
return 0;
}