LC891. 子序列宽度之和
题面
一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。
给你一个整数数组 nums
,返回 nums
的所有非空 子序列 的 宽度之和 。由于答案可能非常大,请返回对 10^9 + 7
取余 后的结果。
子序列 定义为从一个数组里删除一些(或者不删除)元素,但不改变剩下元素的顺序得到的数组。例如,[3,6,2,7]
就是数组 [0,3,1,6,2,2,7]
的一个子序列。
题解
由于是子序列,因此和顺序无关,排序
假设$nums[i]$是最大值,那么最小值只能是$nums[j] (j < i)$
枚举最大值,则最大值产生的贡献为:
拆分可得:
使用两个前缀和维护即可
时间复杂度$O(nlog(n))$
代码
1 | const int mod = 1e9 + 7; |