给定一个整数数组 A
,考虑 A
的所有非空子序列。
对于任意序列 S ,设 S 的宽度是 S 的最大元素和最小元素的差。
返回 A 的所有子序列的宽度之和。
由于答案可能非常大,请返回答案模 10^9+7。
示例:
输入:[2,1,3] 输出:6 解释: 子序列为 [1],[2],[3],[2,1],[2,3],[1,3],[2,1,3] 。 相应的宽度是 0,0,0,1,1,2,2 。 这些宽度之和是 6 。
思路:
先将数组排序
将每一个数看做取最大值和最小值两种可能,求其可能的子集个数乘以该值,最大值累加最小值累减即可
注意:由于计算的2的幂可能很大,超过long的范围,不可用位运算2<<n或Math.pow(2,n)求解,可构造一个数组a[i]=a[i-1]*2mod/100000007递推求解
class Solution {
public int sumSubseqWidths(int[] A) {
// 技巧 计算pow(2,n):1<<n
int mod =1000000007;
//1.排序 3.求宽度累加(减)
Arrays.sort(A);
int len=A.length;
long res=0;
long[] pow2 = new long[len];
pow2[0] = 1;
for (int i = 1; i < len; ++i)
pow2[i] =pow2[i-1]*2% mod;
for(int i=0;i<len;i++){
res+=pow2[i]*A[i];
res-=pow2[len-i-1]*A[i];
res%=mod;
}
return (int)res;
}
}