此题和907.Sum-of-Subarray-Minimums
非常相似。我们不是根据每个区间来考察它的最大值(或最小值)。而是根据根据最大值(或最小值)来考察对应的区间。
我们考察每个元素nums[i],它作为区间最大值时,可以是哪些区间?假设有a个。另外,它作为区间最小值时,可以是哪些区间?假设有b个。那么该元素对于最终答案的贡献就是nums[i]*a-nums[i]*b
.
那么怎么求解a呢?只要用单调栈,来算出nums[i]的prevSmaller所在的位置l,nextSmaller所在的位置r,那么这样的区间的数目就有a=(i-l)*(r-i)
个。求解b同理。
特别注意的是,对于区间内如果存在多个相同的最大值,我们需要约定,比如只有最靠右边的那个才是最大值。在这样的情况下,我们实际计算的应该是prevSmallerOrEqual而不是prevSmaller.