O(n)中最大的子数组总和,使用C ++中的前缀总和

问题陈述

给定一个正整数和负整数数组,找出该数组中的最大子数组总和

示例

如果输入数组为− {-12,-5,4,-1,-7,1,8,-3},则输出为9

算法

  • 计算输入数组的前缀和。

  • 初始化-min_prefix_sum = 0,res =-无穷大

  • 保持i = 0到n的循环。(n是输入数组的大小)。

    • cand = prefix_sum [i] –迷你

    • 如果cand大于res(到目前为止最大子数组和),则按cand更新res。

    • 如果prefix_sum [i]小于min_prefix_sum(到目前为止的最小前缀和),则用prefix_sum [i]更新min_prefix_sum。

  • 返回资源

示例

#include <bits/stdc++.h>
using namespace std;
int maximumSumSubarray(int *arr, int n){
   int minPrefixSum = 0;
   int res = numeric_limits<int>::min();
   int prefixSum[n];
   prefixSum[0] = arr[0];
   for (int i = 1; i < n; i++) {
      prefixSum[i] = prefixSum[i - 1] + arr[i];
   }
   for (int i = 0; i < n; i++) {
      res = max(res, prefixSum[i] - minPrefixSum);
      minPrefixSum = min(minPrefixSum, prefixSum[i]);
   }
   return res;
}
int main(){
   int arr[] = {-12, -5, 4, -1, -7, 1, 8, -3};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Result = " << maximumSumSubarray(arr, n) <<endl;
   return 0;
}

输出结果

当您编译并执行上述程序时。它产生以下输出-

Result = 9