/*
* 题目:
* 3.求子数组的最大和(数组)
* 题目:
* 输入一个整形数组,数组里有正数也有负数。
* 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
* 求所有子数组的和的最大值。要求时间复杂度为 O(n)。
* 例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,
* 因此输出为该子数组的和 18。
*/
#include <iostream>
using namespace std;
/*
* *a++和(*a)++
* *a++,是让a用完之后 a指针向后移动一次
* (*a)++,是让a指向的数据用完之后,自加一次
*/
int maxSum(int* a, int n) {
int sum = 0;
int current = 0;
for (int i = 0; i < n; i++) {
if (current < 0) {
current = a[i];
} else {
current += a[i];
}
if (sum < current) {
sum = current;
}
}
if (sum == 0) { //数组元素全部为负的情况
sum = a[0];
for (int i = 1; i < n; i++) {
if (sum < a[i]) {
sum = a[i];
}
}
}
return sum;
}
int main() {
int a[] = { 1, -2, 3, 10, -4, 7, 2, -5 };
cout << maxSum(a, 8) << endl;
return 0;
}
【微软100题】003求子数组的最大和
最新推荐文章于 2017-05-02 11:07:18 发布