【leetCode】891_子序列寬度之和
阿新 • • 發佈:2019-02-11
難點有兩個,一個是思路,一個是演算法的數學簡化。
思路就是先確定子序列的最大值和最小值,然後直接算出來中間塞其他數字有多少種。
具體操作起來就是,序列排序,然後兩個指標指向最大和最小值,這兩個值中間的數個數為n,則中間這些數能做出來的集合數量 = C(n, 0) + C(n, 1) + C(n, 2) + ... + C(n, n - 1) + C(n, n) = (1 + 1)^n; 以上就是這兩個最大最小值能構成的所有子序列。
class Solution { public: int sumSubseqWidths(vector<int>& A) { sort(A.begin(), A.end()); int i, l = A.size(); long long int ans = 0; long long int a[20010] = {}; int t = 1; for (int k = 0; k < 20010; k ++){ a[k] = t; t *= 2; t %= (1000000000 + 7); } for (i = 0; i < l; i ++){ ans += a[i] * A[i]; ans -= a[l - i - 1] * A[i]; ans %= 1000000007; } return ans; } };