返回一个整数数组中最大子数组的和

要求:

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。

同时返回最大子数组的位置。

求所有子数组的和的最大值。

思路:这次的任务比较上次多了一个环形,所以再利用for循环

源代码:

#include<iostream>
#include<time.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
  int max_subarray_bound(int a[],int from,int to)
{    
      int i,max,sum;        
      max = a[from];    
      sum = a[from];        
     for(i = from + 1;i <= to;i++)  
{         if(sum < 0)            
                 sum = 0;        
                 sum += a[i];        
           if(max < sum)            
                max = sum;    
}
    return max;
}
int max_subarray_cycle(int a[],int size)
{     int sum,i,j,s,m;          
sum = max_subarray_bound(a,0,size-1);    
 
    if(size == 2) return sum;
    i = 1;     j = size-2;
    s = a[i-1] + a[j+1];        
   while(i < j && (a[i] >=0 || a[j] >= 0))  
{         if(a[i] >= 0)   
             {            
                      s += a[i];            
                        i++;        
            }                
        if(a[j] >= 0)   
            {             s += a[j];            
                           j--;        
           }    
  }        
       if(i == j)  
           {        
                  if(a[i] >0)  
                         s+=a[i];        
                 if(s < sum)
                          return sum;        
                 else return s;    
          }        
        if(i < j)  
            {            
         int s2,k;        
          m = a[i];        
          s2 = m;        
         for(k=i+1;k <= j;k++)   
                {            
                     s2 += a[k];            
                    if(m < s2)                
                    m = s2;        
              }                
              s2 = a[j];        
             for(k = j-1;k>=i;k--)  
                  {               s2 += a[j];            
                                  if(m < s2)                
                                                m = s2;        
                }                
                 if(m > 0)            
                       s += m;    
    }        
  if(s < sum)
           return sum;    
   else return s;    
}
int main(int argc,char *argv[])
{    
 int num,*a;  
cout<<"请输入以为数组的长度:";  
cin>>num;  
a = new int [num];    
srand((unsigned)time(NULL));    
for(int i=0;i<num;i++)   
{      a[i]=rand()%100-25;     
        cout<<a[i]<<"  ";      
}  
    cout<<endl;    
     cout<<"环形一维数组子数组和的最大值:  "<<max_subarray_cycle(a,num)<<endl;    
   delete a;     
    return 0;
}

  

结果

 

posted @ 2018-11-04 18:00  吃牛肉  阅读(132)  评论(0编辑  收藏  举报