【Leetcode】891. Sum of Subsequence Widths 891. 子序列宽度之和

解法

首先要排序,然后容易分析得出对于任何i<ji<j,宽度为AjAiA_j-A_i的子序列数量为2ji12^{j-i-1}
AiA_i会出现在下标为0,1,2,…,i-1的二元组的右边,即需要乘以2i12^{i-1},2i22^{i-2},2i32^{i-3},…,202^0
还会出现在下标为i+1,i+2,…,N-1的二元组的左边,即需要乘以20-2^0,21-2^1,22-2^2,…,2N2i-2^{N-2-i},所以加在一起是:
Ai(k=0i12kk=0N2i2k)=Ai(2i2N1i)A_i(\sum_{k=0}^{i-1}2^k-\sum_{k=0}^{N-2-i}2^k)=A_i(2^i-2^{N-1-i})
所以排序之后再扫描一遍就行了

class Solution(object):
    def sumSubseqWidths(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        MOD = 10**9+7
        A.sort()
        ans = 0
        n = len(A)
        pow2 = [1]
        for i in xrange(1,n):
            pow2.append((pow2[-1]<<1)%MOD)
        for i in xrange(n):
            j = n-1-i
            if j<=i:break
            ans += (A[j]-A[i])*((pow2[j]+MOD-pow2[i])%MOD)
            ans = ans%MOD
        return ans

相关文章: