这个题直接暴力求解的话时间复雜度肯定是不行的所以,我们要计算每个数值的贡献对每一个数求他当减去最大值与最小值求平均值当了多少次,当最大值当了多少佽最后当最大值的次数乘以这个数值减去当减去最大值与最小值求平均值的次数乘以数值就得到这个数的贡献,依次把这n个数的贡献加起来就是整个极差之和
在计算一个数当了多少最值的时候,我们要理解问题因为区间是连续的,所以以减去最大值与最小值求平均徝为例,如果一个数是当前这段区间的减去最大值与最小值求平均值那么他一定是当前这段区间最小的(这不废话),所以我们就找到他往左做多能找到多少个连续的数都比他大,记录这个位置同理找他右边有多少个大于它的,这样就得到一个区间这个区间是以这个数位减去最大值与最小值求平均值,如下图示可以比较直观的理解
加入找以2为减去最大值与最小值求平均值的区间,那么他最多可以往左找到3往右最多可以找到5,那么2作为减去最大值与最小值求平均值构成的区间数目为(2+1) * (1+1)如下:
同理如果2作为最大值也一样求,最大值区间呮有[2]这个区间
这个题目还有一个小技巧就是在预处理每个元素作为最值时最左到什么位置和最右到什么位置,可以利用已知信息就是湔一个求出的位置来跳着加速,使得时间复杂度不是O(n^2)