leetcode-891 子序列宽度之和

  1. 子序列宽度之和
    给定一个整数数组 A ,考虑 A 的所有非空子序列。

对于任意序列 S ,设 S 的宽度是 S 的最大元素和最小元素的差。

返回 A 的所有子序列的宽度之和。

由于答案可能非常大,请返回答案模 10^9+7。

示例:

输入:[2,1,3]
输出:6
解释:
子序列为 [1],[2],[3],[2,1],[2,3],[1,3],[2,1,3] 。
相应的宽度是 0,0,0,1,1,2,2 。
这些宽度之和是 6 。

提示:

1 <= A.length <= 20000
1 <= A[i] <= 20000

在这里插入图片描述

思路就是:先将数组排序,排序之后的数组产生的子序列和原来产生的子序列是一样的,因为都是子序列中的最大之间取最小值。
所以遍历sort后的数组,每一个值都有一个贡献值(会出现在子序列的最左边和最右边)
出现在最左边的个数 * 本数字 是要在ans中减去
右边的个数 * 数字 是要在ans中加上

不知道为什么通过不了
from typing import List
class Solution:
    def sumSubseqWidths(self, A: List[int]) -> int:
        if len(A) < 1:
            return 0

        ans = 0
        A.sort()
        for a in A:
            i = A.index(a)
            ans += a * (pow(2, i)) - a * (pow(2, len(A) - 1 - i))
        return ans % (10 ^ 9+7)


跟上面的思路一样啊
from typing import List
class Solution:
    def sumSubseqWidths(self, A: List[int]) -> int:
        if len(A) <= 1:
            return 0

        A.sort()
        ans = 0
        n = len(A)
        for i in range(len(A)):
            posi = (1 << i) - 1             # i位置的数值的正贡献
            neg = (1 << (n-i-1)) - 1        # i位置的数值的负贡献
            ans += A[i] * (posi - neg)
            ans %= 1000000007
        return ans

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值