2.14 子数组之和的最大值

问题:

求数组的子数组之和的最大值


解法一:

遍历

 

#include <stdio.h>

#include <stdlib.h>



int MaxSum(int* A, int n)

{

    int maximum = -100;

    int sum = 0;

    int i = 0, j = 0, k = 0;

    for (i = 0; i < n; i++)

    {

        for(j = i; j < n; j++)

        {

            for(k = i; k <= j; k++)

            {

                sum += A[k];

            }

            if (sum > maximum)

                maximum = sum;

        }

    }

    return maximum;

}



int main()

{

    int array[] = {-9, -2, -3, -5, -3};

    printf("%d\n", MaxSum(array, 5));

    return 0;

}


 


解法二:

分治法,考虑A[0]以及最大的一段数组(A[i],...,A[j])之间的关系。

1. 当0=i=j,元素A[0]本身构成和最大的一段。

2. 当0=i<j,和最大的一段以A[0]开始。

3. 当0<i时,元素A[0]跟和最大的一段没有关系。

 

#include <stdio.h>

#include <stdlib.h>



int max(int x, int y)

{

    return (x > y) ? x :y;

}



int MaxSum(int* array, int n)

{

    int nStart = 0;

    int aAll = 0;

    int i = 0;

    nStart = array[n-1];

    aAll = array[n-1];

    for (i = n-2; i >= 0; i--)

    {

        nStart = max(array[i], nStart + array[i]);

        aAll = max(nStart, aAll);

    }

    return aAll;

}



int main()

{

    int array[] = {-9, -2, -3, -5, -3};

    printf("%d\n", MaxSum(array, 5));

    return 0;

}


 

 

你可能感兴趣的:(数组)