一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。
给你一个整数数组 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 <= 1e5
1 <= nums[i] <= 1e5
解析:
总结:子序列问题+不依赖相对位置(不考虑顺序)==》 不需要保留原有位置 ==》可以排序。
代码:
class Solution {
int mod=1e9+7;
public:
int sumSubseqWidths(vector<int>& nums) {
int n=nums.size();
long f[n+1];
f[0]=0;
for(int i=1;i<n+1;i++){
f[i]=2*f[i-1]+1;
f[i]%=mod;
}
sort(nums.begin(),nums.end());
long res=0;
// 每个元素作为最大最小的元素个数
for(int i=0;i<n;i++){
res += (f[i]-f[n-i-1])*nums[i];
res%=mod;
}
return (int)res;
}
};