📌  相关文章
📜  在采用长度为 K 的非重叠子数组后最大化数组总和(1)

📅  最后修改于: 2023-12-03 14:51:34.095000             🧑  作者: Mango

最大化数组总和问题

给定一个长度为n的数组nums和一个正整数k,我们需要选取一些长度为k的非重叠的子数组,使得子数组之和最大。求这个最大的和。

解法1:暴力枚举

我们可以考虑暴力枚举所有长度为k的子数组,并计算它们的和,最后返回其中的最大值即可。

时间复杂度为O(n*k),空间复杂度为O(1)。

代码实现:

def max_subarray_sum(nums, k):
    n = len(nums)
    if k > n:
        return 0
    max_sum = float('-inf')
    for i in range(n-k+1):
        cur_sum = sum(nums[i:i+k])
        max_sum = max(max_sum, cur_sum)
    return max_sum
解法2:滑动窗口

我们可以利用滑动窗口的思想来解决这个问题。每次从左往右滑动一个长度为k的窗口,计算窗口内元素之和,更新最大值。为了避免重复计算,我们可以记录上一个窗口的和,每次只需要加入新的元素,减去窗口左边的元素即可。

时间复杂度为O(n),空间复杂度为O(1)。

代码实现:

def max_subarray_sum(nums, k):
    n = len(nums)
    if k > n:
        return 0
    cur_sum = sum(nums[:k])
    max_sum = cur_sum
    for i in range(k, n):
        cur_sum += nums[i] - nums[i-k]
        max_sum = max(max_sum, cur_sum)
    return max_sum