求数组的子数组的最大和,时间为O(n)

O(n^3)

#include<stdio.h>

int MaxSum(int* A, int n)
{
     int maximum = -(1<<31);
     int sum=0,i,j,k;
     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;

               sum=0;   //这里要记得清零,否则的话sum最终存放的是所有子数组的和。
                   //也就是编程之美上所说的bug。多谢苍狼。
          }
     }
     return maximum;
}
int main()
{
    int data[]={-10, -3,-4, -3, -4, -1, -5};
    int max;
        printf("%d\n",MaxSum(data,7));
    return 0;

}


//o(N)

#include <iostream>
using namespace std;

int maxSum(int a[],int n)
{
    int max=a[0];       //全负情况,返回最大数
    int sum=0;
    for(int j=0;j<n;j++)
    {
        if(sum>=0)     //如果sum>=0的话,就加
            sum+=a[j];
        else
            sum=a[j];  //如果加上某个元素,sum<0了,就不加
        if(sum>max)
            max=sum;
    }
    return max;
}


int main()
{
   int a[]={1, -2, 3, 100, -4, -7, 2, -5,0,2,20};
    //int a[]={-1,-2,-3,-4};  //测试全是负数的用例
    cout<<maxSum(a,11)<<endl;
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值