【面试常见题目之动态规划】连续子序列的最大和(子数组的最大和)
题目:
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
首先,这是一道很老的题目,但是比较容易写错,我就在某一外企面试中,被面试官的几个test case给测出逻辑错误来。
则
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; }