📜  门| GATE-CS-2014-(Set-2) |第 44 题(1)

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

题目描述

给定一个整数数组A和一个整数k,找到长度为k的连续子数组中的最大值。数组A中的值可能是正,负,零。

输入
  • 第一行包含整数T,表示测试用例的数量。
  • 对于每个测试用例:
    • 第一行包含整数N和K,分别表示数组A的长度和子数组的长度。
    • 第二行包含N个整数,表示数组A。
输出

对于每个测试用例,输出一个整数,表示长度为k的连续子数组的最大值。

示例

输入:

2
5 2
3 4 1 5 6
7 4
9 -3 6 -2 8 -9 1

输出:

9
12
解释

对于第一个测试用例,长度为2的所有连续子数组为:

[3, 4]
[4, 1]
[1, 5]
[5, 6]

其中最大值为6和5,因此答案为6。

对于第二个测试用例,长度为4的所有连续子数组为:

[9, -3, 6, -2]
[-3, 6, -2, 8]
[6, -2, 8, -9]
[-2, 8, -9, 1]

其中最大值为12,因此答案为12。

代码片段

以下是Python 3语言的代码片段:

for _ in range(int(input())):
    n, k = map(int, input().split())
    arr = list(map(int, input().split()))
    max_sum = sum(arr[:k])
    curr_sum = max_sum

    for i in range(k, n):
        curr_sum = curr_sum + arr[i] - arr[i-k]
        max_sum = max(max_sum, curr_sum)

    print(max_sum)
解析

该问题可以使用滑动窗口方法解决。滑动窗口是一种数据处理方法,通过定义一个窗口来跟踪数据表中一组数据的变化,以便在不扫描整张表的情况下对数据进行操作。在本例中,该方法通过定义一个长度为k的窗口来计算长度为k的所有子数组的和,并记录其最大值。然后该窗口往右移动一位,并重新计算新的子数组的和,重复该过程直至到达数组末尾。在此过程中,记录子数组和的最大值。

该方法的时间复杂度为O(n),其中n为数组A的长度,因为每个元素只计算了一次。空间复杂度为O(1),因为只使用了常量空间。