给一个数组,求这个数组的所有子序列(可以不连续)的最大值和最小值的差的和
如果考虑所有的子序列显然是N^2的数量级,还要求出来最大值和最小值,那么复杂度高达O(N^3)
其实我们可以单独考虑每个值对答案的贡献
当A[i]作为最大值的值时候对答案的贡献为A[i]
当A[i]作为最小值的值时候对答案的贡献为-A[i]
因此我们可以对数组先排个序(因为是子序列,数组元素的位置修改并不影响)
考虑A[i]什么时候为最大值的时候因为比A[i]小的数有i个,因此有2^i种情况,同理比A[i]大的数有length-1-i个
因此A[i]对答案的贡献为2^i*A[i]-2^(length-i-1)*A[i]
public int sumSubseqWidths(int[] A) {
int mod = 10_0000_0007;
Arrays.sort(A);
long res = 0;
int[] pow = new int[A.length];
pow[0] = 1;
for (int i = 1; i < A.length; i++) pow[i] = pow[i - 1] * 2 % mod;
for (int i = 0; i < A.length; i++) {
res += 1L * pow[i] * A[i];
res -= 1L * pow[A.length - 1 - i] * A[i];
res %= mod;
}
return (int) res;
}