📜  门| GATE-CS-2017(套装1)|第 49 题(1)

📅  最后修改于: 2023-12-03 15:12:44.138000             🧑  作者: Mango

介绍

本题出现在 GATE-CS-2017(套装1)中,是一道算法题。需要求出一个数组中最大子数组的和。具体要求及输入输出格式见下文。

输入格式

第一行为一个整数 $T$,表示测试用例的数量。

对于每个测试用例,第一行为一个整数 $N$,表示数组的长度。第二行为 $N$ 个整数 $A_1, A_2, \dots, A_N$,表示数组中的元素。

输出格式

对于每个测试用例,输出一行一个整数,表示数组中最大子数组的和。

示例

输入
2
9
-2 1 -3 4 -1 2 1 -5 4
5
1 2 3 -1 -2
输出
6
6

解法

采用 Kadane's algorithm,时间复杂度 $O(n)$。

初始值设为 $maxsum$ 和 $sum$ 都为该数组的第一个元素,从第二个元素开始循环,每次将该元素加入 $sum$ 中。如果 $sum$ 大于 $maxsum$,则更新 $maxsum$。如果 $sum$ 小于零,则将其重置为零。

代码如下:

def kadane(arr):
    maxsum = arr[0]
    sum = arr[0]
    for i in range(1, len(arr)):
        sum += arr[i]
        if sum > maxsum:
            maxsum = sum
        if sum < 0:
            sum = 0
    return maxsum

总结

本题的主要难点在于 Kadane's algorithm 的理解。Kadane's algorithm 是求解最大子数组和问题的标准算法,在很多面试中都可能被考察。掌握了这个算法,对于面试和算法竞赛都有很大的帮助。