问题描述
一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。
给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 。由于答案可能非常大,请返回对 109 + 7 取余 后的结果。
子序列 定义为从一个数组里删除一些(或者不删除)元素,但不改变剩下元素的顺序得到的数组。例如,[3,6,2,7] 就是数组 [0,3,1,6,2,2,7] 的一个子序列。
示例 1:
输入:nums = [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:输入:nums = [2]
输出:0
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 105来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-of-subsequence-widths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Java 数学
class Solution {
public int sumSubseqWidths(int[] nums) {
int mod = (int)Math.pow(10,9) + 7;
int N = nums.length;
Arrays.sort(nums);
long[] pow2 = new long[N];
pow2[0] = 1;
for(int i = 1;i < N;i++){
pow2[i] = pow2[i - 1] * 2 % mod;
}
long ans = 0;
for(int i = 0;i < N;i++){
ans = (ans + (pow2[i] - pow2[N - i - 1]) * nums[i] % mod) % mod;
}
return (int)ans;
}
}