1. 程式人生 > >【leetCode】891_子序列寬度之和

【leetCode】891_子序列寬度之和

難點有兩個,一個是思路,一個是演算法的數學簡化。

思路就是先確定子序列的最大值和最小值,然後直接算出來中間塞其他數字有多少種。

具體操作起來就是,序列排序,然後兩個指標指向最大和最小值,這兩個值中間的數個數為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;
    }
};