📅  最后修改于: 2023-12-03 15:10:35.174000             🧑  作者: Mango
给定一个长度为 N 的数组 arr,和两个整数 X 和 K。在数组 arr 中,要从左往右遍历,试图最大化每 X 个连续元素的和,但是对于每一个 i,如果 arr[i] > K,那么数组中 [i, i+X] 的元素必须全部舍弃。
请你在执行如上操作后,返回每 X 个连续元素的和的最大值。
首先需要遍历整个数组,找到所有满足 arr[i] > K 的 i,将 [i, i+X] 区间内的元素全部舍弃。
接下来,每 X 个连续元素的和的最大值,可以使用滑动窗口来计算。设当前滑动窗口的左边界为 l,右边界为 r,则每次向右移动窗口时,左边界需要减一,右边界需要加一,并且需要将 arr[l] 从当前窗口的和中减去,将 arr[r] 加入到当前窗口的和中。当每次窗口移动时,可以计算当前窗口内的和,将最大值记录下来。
class Solution:
def maxSum(self, arr: List[int], X: int, K: int) -> int:
# 找到所有需要舍弃的元素
n = len(arr)
remove = []
for i in range(n):
if arr[i] > K:
remove += list(range(i, min(i+X, n)))
# 滑动窗口计算每 X 个连续元素的最大值
res = -float('inf')
l, r = 0, X-1
cur_sum = sum(arr[:X])
while r < n:
if l in remove:
cur_sum -= arr[l]
l += X
r = l + X - 1
if r < n:
cur_sum = sum(arr[l:r+1])
else:
res = max(res, cur_sum)
r += 1
if r < n:
cur_sum += arr[r]
l += 1
return res