青训营刷题 子数组和的最大值问题 简单题

91 阅读1分钟

问题描述

小U手上有一个整数数组,他想知道如果从数组中删除任意一个元素后,能得到的长度为 k 的子数组和的最大值。你能帮小U计算出这个结果吗?
如果数组恰好为 k 个元素,那么不进行删除操作。


测试样例

样例1:

输入:n = 5,k = 3,nums = [2, 1, 3, -1, 4]
输出:8

样例2:

输入:n = 6,k = 2,nums = [-1, -1, 5, -2, 3, 4]
输出:8

样例3:

输入:n = 4,k = 2,nums = [-5, -3, 2, 1]
输出:3

思路

使用一个大小为k+1的滑动窗口,统计窗口内数字的和,然后遍历窗口内的每个数,将其减去后与最大值对比,当滑动到最后时,最大值即为答案。

注意对n==k时进行特殊处理。

完整代码

def solution(n, k, nums):
    if k == n:
        return sum(nums)
    
    max_sum = float('-inf')
    temp_sum = sum(nums[: k + 1])

    for i in range(k + 1):
        max_sum = max(max_sum, temp_sum - nums[i])
    
    for i in range(k + 1, n):
        temp_sum = temp_sum - nums[i - k - 1] + nums[i]
        for j in range(i - k, i):
            max_sum = max(max_sum, temp_sum - nums[j])

    return max_sum

if __name__ == "__main__":
    print(solution(5, 3, [2, 1, 3, -1, 4]) == 8) 
    print(solution(6, 2, [-1, -1, 5, -2, 3, 4]) == 8)
    print(solution(4, 2, [-5, -3, 2, 1]) == 3)