📅  最后修改于: 2023-12-03 15:26:03.486000             🧑  作者: Mango
给定一个包含 n 个元素的整数数组和一个正整数 K,找出长度为 K 的连续子数组的最大和。你的程序应该在 O(n) 的时间复杂度内运行。
例如:
输入:arr[] = {1, 4, 2, 10, 2, 3, 1, 0, 20}, K = 4 输出:最大子数组和为 24,子数组为 {2, 10, 2, 3}
输入:arr[] = {-4, -2, 1, -5, 3, 2, -1, 8, -8, 6}, K = 4 输出:最大子数组和为 7,子数组为 {3, 2, -1, 8}
这个问题可以使用 Sliding Window 技巧来解决。
我们可以定义两个指针,left 和 right,它们指向当前子数组的左右边界。每次将 right 右移一位,同时更新子数组的和。如果子数组的长度等于 K,则左边界 left 右移一位,同时从子数组和中减去左侧数字的值。
这样我们就可以在 O(n) 时间内完成计算。
def max_subarray(arr, k):
n = len(arr)
if k > n:
return None
max_sum = float('-inf') # 用负无穷大初始化当前子数组的最大和
cur_sum = 0 # 初始化当前子数组的和
# 初始化左右指针
left = 0
right = 0
# 使用 while 循环遍历整个数组
while right < n:
# 增加右指针并更新当前子数组的和
cur_sum += arr[right]
# 当子数组的长度等于 k 时,更新子数组的最大和
if right - left + 1 == k:
max_sum = max(max_sum, cur_sum)
# 减去左侧数字的值并移动左指针
cur_sum -= arr[left]
left += 1
# 移动右指针
right += 1
return max_sum
# 测试用例
arr = [1, 4, 2, 10, 2, 3, 1, 0, 20]
k = 4
print(max_subarray(arr, k)) # 输出:24
arr = [-4, -2, 1, -5, 3, 2, -1, 8, -8, 6]
k = 4
print(max_subarray(arr, k)) # 输出:7
该算法的时间复杂度是 O(n),其中 n 是给定数组的长度。因为我们只遍历了整个数组一次,每次操作只花费常量时间,因此时间复杂度是线性的。