1. 问题描述
输入一个整形数组,求数组中连续的子数组使其和最大。比如,数组x
应该返回 x[2..6]的和187.
2. 问题解决
我们很自然地能想到穷举的办法,穷举所有的子数组的之和,找出最大值。
穷举法
i, j的for循环表示x[i..j],k的for循环用来计算x[i..j]之和。
maxsofar = 0
for i = [0, n)
for j = [i, n)
sum = 0
for k = [i, j]
sum += x[k]
/* sum is sum of x[i..j] */
maxsofar = max(maxsofar, sum)
有三层循环,穷举法的时间复杂度为\(O(n^3)\)
对穷举法的改进1
我们注意到x[i..j]之和 = x[i..j-1]之和 + x[j],因此在j的for循环中,可直接求出sum。
这篇博客探讨了如何找到一个整数数组中连续子数组的最大和问题。介绍了穷举法及其改进、分治法和动态规划(Kadane算法)三种解决方案。其中,动态规划方法以(O(n))的时间复杂度提供了最高效的解决方案。
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



