子陣列的最大累加和問題
阿新 • • 發佈:2021-02-06
題目:給定一個數組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); }
執行結果: