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

1

解法

首先要排序,然后容易分析得出对于任何 i &lt; j i&lt;j i<j,宽度为 A j − A i A_j-A_i AjAi的子序列数量为 2 j − i − 1 2^{j-i-1} 2ji1
A i A_i Ai会出现在下标为0,1,2,…,i-1的二元组的右边,即需要乘以 2 i − 1 2^{i-1} 2i1, 2 i − 2 2^{i-2} 2i2, 2 i − 3 2^{i-3} 2i3,…, 2 0 2^0 20
还会出现在下标为i+1,i+2,…,N-1的二元组的左边,即需要乘以 − 2 0 -2^0 20, − 2 1 -2^1 21, − 2 2 -2^2 22,…, − 2 N − 2 − i -2^{N-2-i} 2N2i,所以加在一起是:
A i ( ∑ k = 0 i − 1 2 k − ∑ k = 0 N − 2 − i 2 k ) = A i ( 2 i − 2 N − 1 − i ) 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}) Ai(k=0i12kk=0N2i2k)=Ai(2i2N1i)
所以排序之后再扫描一遍就行了

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值