Leetcode 3428. Maximum and Minimum Sums of at Most Size K Subsequences

1. 解题思路

这一题不需要连续性,因此我们就是考虑取得子串长度为别为1到k的情况下时,每一个元素作为最小的元素以及最大的元素时可以选取的方法总数。而这就是一个简单的排列组合的问题,假设一个元素有n和元素比他大,m个元素比他小,则在长度为k的子串当中其可以作为最大或者最小元素的选择方法总数就是: C n k − 1 + C m k − 1 C_n^{k-1} + C_m^{k-1} Cnk1+Cmk1

我们将其翻译为python代码语言即可。

2. 代码实现

给出python代码实现如下:

MOD = 10**9+7

Factorials = [1 for _ in range(10**5+1)]
Revs = [1 for _ in range(10**5+1)]
for i in range(2, 10**5+1):
    Factorials[i] = (i * Factorials[i-1]) % MOD
    Revs[i] = pow(Factorials[i], -1, mod=MOD)

def C(n, m):
    return (Factorials[n] * Revs[n-m] * Revs[m]) % MOD if n >= m else 0

class Solution:
    def minMaxSums(self, nums: List[int], k: int) -> int:
        nums = sorted(nums)
        n = len(nums)
        
        ans = 0
        for i, x in enumerate(nums):
            for m in range(1, k+1):
                ans = (ans + x * (C(i, m-1) + C(n-1-i, m-1))) % MOD
        return ans

提交代码评测得到:耗时8359ms,占用内存37.6MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值