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

本文介绍了一种高效算法,用于解决特定子序列宽度求和问题。通过对输入序列进行排序,并利用数学公式推导,该算法能在O(n)时间内计算所有可能的子序列宽度之和。文章还提供了一个Python实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1

解法

首先要排序,然后容易分析得出对于任何i&lt;ji&lt;ji<j,宽度为Aj−AiA_j-A_iAjAi的子序列数量为2j−i−12^{j-i-1}2ji1
AiA_iAi会出现在下标为0,1,2,…,i-1的二元组的右边,即需要乘以2i−12^{i-1}2i1,2i−22^{i-2}2i2,2i−32^{i-3}2i3,…,202^020
还会出现在下标为i+1,i+2,…,N-1的二元组的左边,即需要乘以−20-2^020,−21-2^121,−22-2^222,…,−2N−2−i-2^{N-2-i}2N2i,所以加在一起是:
Ai(∑k=0i−12k−∑k=0N−2−i2k)=Ai(2i−2N−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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值