求一循环数组的最大子数组的和

解题思路:

当数组是首尾相连时,求连续子数组最大和的方法可以归纳如下:

1.将原数组进行扩充,即假设原数组为{1,2,-3,4,5},则扩充相当于{1,2,-3,4,5,1,2,-3,4,5}

2.利用上述的解法在扩充后的数组进行遍历求其连续子数组的最大和,不过要做一些小改动,即保证子数组的长度在原数组的长度范围之内。这样求出来的结果即是原数组首尾相连后,连续子数组的最大和。

#include<iostream>
#include<cmath>
using namespace std;
void main()
{
    int a[25000],i,j,n,MaxSum,k,m,h,p;
    int f=0;
    int b[10],d[10];
   
    cout<<"请输入数组中数字的个数"<<endl;
    cin>>n;
    cout<<"请输入数组"<<endl;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for(i=n;i<2*n;i++)
    {
        a[i]=a[i-n];
    }
    cout<<endl;
   
  

  for(i=0;i<n;i++)
  {
      k=0;
      MaxSum=0;
      h=i;
      for(j=i;j<i+n;j++) { k += a[j];
        if(k > MaxSum)
          {
              MaxSum = k;
              h=j;
           }
 
        if(k < 0)
          {
              k = 0;
          }
      }
       d[i]=h;
       b[i]=MaxSum;
    
  }
  int c=b[0];
    m=0;
    h=0;
  for(i=1;i<n;i++)
  {
      if(c<=b[i])
      {
          c=b[i];
          m=i;
          h=d[i];
      }
  }
   p=h-n+1;
   if(p<=0)
   {   p=n;}
   cout<<"从第"<<m+1<<"个到第"<<p<<""<<endl;
   cout<<"最大子数组为"<<endl;
   for(i=m;i<h+1;i++)
   { cout<<a[i]<<" ";}
   cout<<endl;
   cout<<"最大子数组之和为"<<c<<endl;
 
}

五 总结反思

       对于数组的理解更加深刻,团队合作很重要。

 

原文地址:https://www.cnblogs.com/LJT666/p/4428253.html