题目简介:
一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。
给你一个整数数组 nums
,返回 nums
的所有非空 子序列 的 宽度之和 。由于答案可能非常大,请返回对 109 + 7
取余 后的结果。
子序列 定义为从一个数组里删除一些(或者不删除)元素,但不改变剩下元素的顺序得到的数组。例如,[3,6,2,7]
就是数组[0,3,1,6,2,2,7]
的一个子序列。
示例 1:
1 | 输入:nums = [2,1,3] |
示例 2:
1 | 输入:nums = [2] |
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 105
思路:
由于题目要求的子序列并不需要连续,所以与元素所处的位置无关。
我们计算每个元素所能作出的贡献,因此我们先对数组进行排序。
例如数组[1, 2, 3, 4]
,对于3
这个元素,它作为子数组最大值的情况便是[3], [1, 3], [2, 3], [1, 2, 3]
。
因此对于下标i
,作为最大值的个数为2^i
,作为最小值的个数为2^(n - i - 1)
。
因此对于每个元素nums[i]
,其作出的最后贡献为(count[i] - count[n - i - 1]) * nums[i]
。
tip:
- 为防止溢出,需要使用
long
。
代码如下:
1 | class Solution { |