求數組的所有子數組的和的最大值


題目描述:

輸入一個整形數組,數組里有正數也有負數。 數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。 求所有子數組的和的最大值。要求時間復雜度為O(n)。

例如輸入的數組為8,-4,6,-1,3,7,2,-3,和最大的子數組為8,-4,6,-1,3,7,2, 因此輸出為該子數組的和21。

思路分析:

求一個數組的最大子數組和,如輸入的數組為8,-4,6,-1,3,7,2,-3。由於要考慮到時間復雜度,即要盡量減少for的循環遍歷次數,我和丹丹討論了一下,想到了時間復雜度

為O(n)的算法如下:

#include<iostream.h>
int maxsum(int*a,int n)
{
	int sum=0;
	int c=0;
	for(int i=0;i<n;i++)
	{
		if(c<0)
			c=a[i];
		else
			c+=a[i];
		if(sum<c)
			sum=c;
	}
	return sum;
}
int main()
{
	int a[8]={8,-4,6,-1,3,7,2,-3};
	cout<<maxsum(a,8)<<endl;
	return 0;
}

  

運行結果如下:

考慮到數組全是負數的情況,我和丹丹又對程序做了一些改變:

#include <iostream.h>     
#define n 8 
int maxsum(int a[n])      
{    
int max=a[0];       //如果是全負情況,返回最大數     
int sum=0;    
for(int i=0;i<n;i++)    
{    
    if(sum>=0)     //如果加上某個元素,sum>=0的話,就加     
       sum+=a[i];    
   else       
      sum=a[i];  //如果加上某個元素,sum<0了,就不加     
    if(sum>max)    
         max=sum;    
  }    
   return max;    
}       
int main()    
{    
   int a[]={-8,-4,-6,-1,-5,-7,-2,-3};    
   cout<<maxsum(a)<<endl;    
   return 0;    
}    

運行結果:

以上是我們對求數組的所有子數組的和的最大值程序設計的探討。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM