LeetCode 891. 子序列宽度之和(数学)
作者:互联网
文章目录
1. 题目
给定一个整数数组 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 。
提示:
1 <= A.length <= 20000
1 <= A[i] <= 20000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-subsequence-widths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
类似题目:
LeetCode 907. 子数组的最小值之和(单调栈)
天池 在线编程 所有子数组之和(排列组合)
class Solution {
public:
int sumSubseqWidths(vector<int> &A) {
long long ans = 0, mod = 1e9+7;
long long n = A.size();
sort(A.begin(), A.end());
// 每个数作为最小值的时候,右侧有多少种方案 2^(n-i-1);
// 每个数作为最大值的时候,左侧有多少种方案 2^(i);
vector<long long> p2(n);
p2[0] = 1;
for(int i = 1; i < n; i++)
p2[i] = (p2[i-1]<<1)%mod;
for(int i = 0; i < n; ++i)
{
ans = (ans + (p2[i]-p2[n-i-1])*A[i])%mod;
}
return (ans+mod)%mod;
}
};
68 ms 26.6 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
标签:p2,891,long,宽度,ans,序列,LeetCode,mod 来源: https://blog.csdn.net/qq_21201267/article/details/114190097