您的位置:首页 > 职场人生

面试题2:求子数组的最大和

2011-06-23 17:46 423 查看
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

分析:
动态规划。求maxsum(n),maxsum(n)是前n个元素中包含第n个元素的子数组最大和。递归公式:
if maxsum(n-1)>0,则maxsum(n)=maxsum(n-1)+element(n);否则,maxsum(n)=element(n)。

#include <iostream>
const int mininum=-100000;
using namespace std;
void maxsum(int * element,int size){
int max=mininum;
int max_index=0;
int * index=new int [size];//保存子数组的开始位置
int * max_sum=new int [size];//保存最大和
index[0]=0;
max_sum[0]=element[0];
for(int i=1;i<size;i++){
if(max_sum[i-1]>0){
max_sum[i]=max_sum[i-1]+element[i];
index[i]=index[i-1];
}
else{
max_sum[i]=element[i];
index[i]=i;
}
if(max_sum[i]>max){
max=max_sum[i];
max_index=i;
}
}
cout<<"The max subarray is:"<<endl;
for(int i=index[max_index];i<=max_index;i++){
cout<<element[i]<<' ';
}
cout<<endl<<"The sum is:"<<max<<endl;
delete [] index;
delete [] max_sum;
}
int main(){
cout<<"Please input the number of the element:"<<endl;
int size;
cin>>size;
int * element=new int[size];
for(int i=0;i<size;i++){
cin>>element[i];
}
maxsum(element,size);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: