您的位置:首页 > 职场人生

【面试常见题目之动态规划】连续子序列的最大和(子数组的最大和)

2012-07-16 17:36 218 查看

题目:

输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: