subMaxSum

来源:互联网 发布:手机淘宝店铺管理在哪 编辑:程序博客网 时间:2024/06/05 19:31

采用分治法,复杂度为 O(nlgn)

int max (int a, int b)        {return (a > b)? a: b;}int max3(int a, int b, int c) {return max(c, max(a, b));}int subMax(int A[], int l, int u){    int i, sum, lmax, rmax, m = (l + u) / 2;    if (l  > u) return 0;    if (l == u) return max(0, A[0]);            // Find leftSubMax to left    lmax = sum = 0;    for (i = m; i >= 0; --i) {        sum += A[i];        lmax = max(lmax, sum);    }    // Find rightSubMax to right    rmax = sum = 0;    for (i = m + 1; i < u; ++i) {        sum += A[i];        rmax = max(rmax, sum);    }    return max3(lmax + rmax, subMax(A, l, m), subMax(A, m + 1, u));}

采用扫描算法,复杂度为 O(n)

int subMax(int A[], int n){    int i, maxsofar = 0, maxendhere = 0;    for (i = 0; i < n; ++i) {        maxendhere = max(maxendhere + A[i], 0);        maxsofar   = max(maxendhere, maxsofar);    }    return maxsofar;}