📅  最后修改于: 2023-12-03 14:51:34.095000             🧑  作者: Mango
给定一个长度为n的数组nums和一个正整数k,我们需要选取一些长度为k的非重叠的子数组,使得子数组之和最大。求这个最大的和。
我们可以考虑暴力枚举所有长度为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
我们可以利用滑动窗口的思想来解决这个问题。每次从左往右滑动一个长度为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