问题描述
小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)