题目:
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
思路:
首先,这是一道很老的题目,但是比较容易写错,我就在某一外企面试中,被面试官的几个test case给测出逻辑错误来。
算法如下:假设当前最大和 MAX,连续相加不为零的和 SUM,数组当前扫描值 A[i];
则
if (SUM > MAX) MAX = SUM;
if (A[i] > MAX) MAX = A[i];
if (SUM < 0) SUM = 0;
最后,对于全负数的情况,需要从头再扫描一遍,选出最大的负数。
代码和测试用例
#include <iostream>
using namespace std;
int max_seq_sum(int a[], int len) {
int max = a[0];
int sum = 0;
for (int i = 0; i < len; i++) {
sum += a[i];
if (sum > max) {
max = sum;
}
if (a[i] > max) {
max = a[i];
}
if (sum < 0) {
sum = 0;
}
}
if (0 == max) {
max = a[0];
for (int i = 0; i < len; i++) {
if (a[i] > max) {
max = a[i];
}
}
}
return max;
}
int main() {
int a[] = {10, -2, -3};
int b[] = {-10, -2, -3};
int c[] = {3, -2, 10};
cout << max_seq_sum(a, 3) << endl;
cout << max_seq_sum(b, 3) << endl;
cout << max_seq_sum(c, 3) << endl;
}