1. 程式人生 > 其它 >子陣列的最大累加和問題

子陣列的最大累加和問題

技術標籤:C/C++面試子陣列最大累加和

題目:給定一個數組arr,返回子陣列的最大累加和

例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子陣列中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.

[要求]

時間複雜度為O(n),空間複雜度為O(1)

問題考察核心就是連續的數求和後不能負數,如果為負肯定影響後面數的和,例如,前兩個數為1、-2,和為-1,與後面數3的和為2,那寧願不要這兩個數。

#include <math.h>
#include <stdio.h>
 
//暴力法,求出所有的max,時間複雜度為O(n^2)
int maxSum4SubArray1(const int* array, const int n)
{
    int max    = 0;
 
    for (int i = 0; i < n; ++i) {
        int curSum = 0;
 
        for (int j = i; j < n; ++j) {
            curSum += array[j];
 
            if (curSum > max) {
                max = curSum;
            }
        }
    }
 
    return max;
}
 
//遞推法,如果和出現了負數則捨棄,時間複雜度為O(n)
int maxSum4SubArray2(const int* array, const int n)
{
    int max    = 0;
    int curSum = 0;
 
    for (int i = 0; i < n; ++i) {
        curSum += array[i];
        if (curSum < 0) {
            curSum = 0;
        }
 
        if (curSum > max) {
            max = curSum;
        }
    }
 
    return max;
}
 
void test8()
{
    int array[] = {1, -2, 3, 5, -2, 6, -1};
 
    int max1 = maxSum4SubArray1(array, 7);
    int max2 = maxSum4SubArray2(array, 7);
 
    printf("test8, max1: %d, max2: %d\n", max1, max2);
}

執行結果: