算法-求数组的子数组之和的最大值

这篇博客探讨了如何找到一维整数数组中子数组之和的最大值。提出了三种解法:直接遍历法(O(N^2))、分治法(O(N log N))和动态规划法(O(N))。动态规划法是通过维护两个变量在遍历过程中计算最大和,同时解决了空间复杂度问题。
摘要由CSDN通过智能技术生成

一个一维int数组,这个数组有很多子数组,那么子数组之和的最大值是什么呢?

思考
  1、题目说的子数组是连续的;
  2、题目只需要求和,并不需要返回子数组的具体位置;
  3、数组的元素是整数,所以数组可能包含有正整数、零、负整数;

举几个例子:
  数组:[1, -2, 3, 5, -3, 2]应返回:8
  数组:[0, -2, 3, 5, -1, 2]应返回:9
  数组:[-9, -2, -3, -5, -3]应返回:-2,这也是最大子数组的和。

【解法一】:
  直接的方法,记Sum[i,…,j]为数组A中第i个元素的第j个元素的和(其中0<=i<=j<n),遍历所有可能的Sum[i,…j],那么时间复杂度为O(NNN):

int MaxSum(int* A, int n)
{
   
      int maxmum = -INF;
      int sum;
      for (int i = 0; i < n; i++)
      {
   
           for (int j = i; j < n; j++)
           {
   
                for (int k = i; k<=j; k++)
                {
   
                     sum += A[k];
                }
                if (sum > maxmum)
                     maxmum = sum;
           }
      }
      return maxmum;
}

如果注意到Sum[i,…j] = Sum[i,…j-1] + A[j],则可以将算法中的最后一个for循环省略,避免重复计算,从而使算法得以改进,改进后的算法如下,这时复杂度为O(N*N):

int MaxSum(int* A, <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值