📌  相关文章
📜  最大化数组总和,除了来自 [i, i+X] 的元素之外的所有 i 使得 arr[i] > K(1)

📅  最后修改于: 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
复杂度分析
  • 时间复杂度:查找需要舍弃的元素和计算滑动窗口的和都需要遍历整个数组,因此时间复杂度为 O(N)。
  • 空间复杂度:需要一个 remove 数组来保存需要舍弃的元素,因此空间复杂度为 O(N)。