2834. 找出美丽数组的最小和 【求和 O(1) 注意看能不能套公式。】

29 阅读1分钟

2834. 找出美丽数组的最小和

image.png

class Solution:
    def minimumPossibleSum(self, n: int, target: int) -> int:
        mod = 10**9 + 7 
        m = target // 2  # 前面部分的 项数
        if n <= m:
            return ((1 + n) * n // 2) % mod 
        
        # 后面 由于从1 开始, target 及 超过 target 的部分 均满足求和要求。   
        #  target, target + 1, target + 2 .. target + (n - m - 1)   
        # 求和 (target + (target + (n -m - 1))) * (n - m) // 2
        # 前面部分, 1, 2, 3, ..., target//2 。  贪心,后面 target - i 显然更大。为求和最小,取前面部分
        return ( (1 + m) * m // 2 + (target * 2 + (n - m - 1)) * (n - m) // 2 ) % mod

image.png

class Solution {
public:
    int minimumPossibleSum(int n, int target) {
        long long m = min(target / 2, n);
        return (m * (m + 1) + (n - m - 1 + target * 2) * (n - m)) / 2 % 1'000'000'007;     
    }
};