IT公司100题-3-求数组的最大子序列的和
问题描述:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2
因此输出为该子数组的和18。
分析:
最直接的方法就是找出所有的子数组,然后求其和,取最大。如果每个子数组都遍历求和,该方法的复杂度为O(N^3)。
时间复杂度O(n)的实现代码,如下所示:
1 // 3.cc 2 #include <iostream> 3 using namespace std; 4 5 // 求子数组连续最大和 6 int max_sub_sum(int* a, int n) { 7 int sum = a[n - 1]; 8 int start = a[n - 1]; 9 for(int i = n - 2; i >= 0; i--) { 10 start = max(start + a[i], a[i]); 11 sum = max(sum, start); 12 } 13 return sum; 14 } 15 16 int main() { 17 int a[7] = {-2, 5, 3, -6, 4, -8, 6}; 18 int max_sub = max_sub_sum(a, 7); 19 cout << "max sub sum is: " << max_sub << endl; 20 }