求数组中最大的连续序列的和,如果数组元素全为负数返回0
遍历 以i为起点,长度为1 - n-i+1 ,i =0 ... n-1 ,时间复杂度O(n^2)
int maxSeq(int *arr,int num,int&start,int&end){ int ret=0; start=-1; end=-1; int s=0; for(int i=0;i<num;++i){ int maxLen=num-i; int temp=0; for(int len=1;len<=maxLen;++len){ temp+=arr[i+len-1]; if(temp>ret){ ret=temp; start=i; end=i+len-1; } } } return ret; }
动态规划,依次加入数组中元素进行统计,时间复杂度O(n)
//dp int maxSeqDP(int *arr,int num,int&start,int&end){ int ret=0; int temp=0; start=-1; end=-1; int s=0; for(int i=0;i<num;++i){ temp+=arr[i]; if(temp<0){ temp=0; s=i+1; }else if(temp>ret){ ret=temp; start=s; end=i; } } return ret; }
#include <iostream> #include <cstdlib> int main(int argc,char** argv){ int num=10; if(argc>=2) num=atoi(argv[1]); int *arr=new(std::nothrow) int [num]; srand(time(NULL)); for(int i=0;i<num;++i){ arr[i]=rand()%1000>=400?rand()%99:rand()%99*-1; std::cout<<arr[i]<<","; } std::cout<<std::endl; int start=0,end=0; std::cout<<maxSeq(arr,num,start,end); std::cout<<",["<<start<<","<<end<<"]"<<std::endl; std::cout<<maxSeqDP(arr,num,start,end); std::cout<<",["<<start<<","<<end<<"]"<<std::endl; delete []arr; return 0; }
参考下面这篇博客,不同的是,这位作者在数组中元素全为负数的时候,返回的是最小的负数。
http://blog.csdn.net/sgbfblog/article/details/8032464