891. 子序列宽度之和

一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。
给你一个整数数组 nums ,返回 nums 的所有非空 子序列宽度之和 。由于答案可能非常大,请返回对 1e9 + 7 取余 后的结果。
子序列 定义为从一个数组里删除一些(或者不删除)元素,但不改变剩下元素的顺序得到的数组。例如,[3,6,2,7] 就是数组 [0,3,1,6,2,2,7] 的一个子序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
private static final int MOD = (int) 1e9 + 7;

public int sumSubseqWidths(int[] nums) {
Arrays.sort(nums);
var n = nums.length;
var pow2 = new int[n];
pow2[0] = 1;
for (var i = 1; i < n; ++i)
pow2[i] = pow2[i - 1] * 2 % MOD; // 预处理 2 的幂次
var ans = 0L;
for (var i = 0; i < n; ++i)
ans += (long) (pow2[i] - pow2[n - 1 - i]) * nums[i]; // 在题目的数据范围下,这不会溢出
return (int) (ans % MOD + MOD) % MOD; // 注意上面有减法,ans 可能为负数
}
}