[编程之美]求数组的连续子数组最大和

求连续子数组的最大和

一个整型数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值,要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,那么最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18,
说明:
当全是负数的情况时,返回最大的那个负数

C语言代码:

/*
解题思路:
    初始化变量:
        max = a[0];        //记录最终的最大值
        tmp_sum = 0;        //临时和
    伪代码:
        for i from 0 to n
            tmp_sum += a[i]
            if tmp_sum > max
                max = tmp_sum
            if tmp_sum < 0
                tmp_sum = 0;
        endif
*/

#include <stdio.h>

#define MAX(a, b) ((a) >= (b) ? (a):(b))

int Max_sum(int *a, int n)
{
    int i;
    int max, tmp_sum = 0;
    if(n == 0){
        return 0;
    }
    max = a[0];
    for(i = 0; i < n; i++){
        tmp_sum += a[i];
        max = MAX(max, tmp_sum);
        if(tmp_sum < 0){
            tmp_sum = 0;
        }
    }
    return max;
}

int main()
{
    int a[8] = {1, -2, 3, 10, -4, 7, 2, -5};
    printf("max_sum is:%d\n", Max_sum(a, 8));
    return 0;
}