- 子序列宽度之和
给定一个整数数组 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