首页 > 技术文章 > 题目:返回一个整数数组中最大子数组的和

laozhanghahaha 2015-03-22 20:49 原文

要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。

思路: 

如输入1 2 3 4 5 -6  7 -8 9 0

从1开始逐步向后加,取最大的记为max[0],同时记录下加到第几个数时得到最大值,记位置为k

从2开始逐步向后加,取最大的记为max[1],同时记录下加到第几个数时得到最大值,记位置为k

从3开始逐步向后加,取最大的记为max[2],同时记录下加到第几个数时得到最大值,记位置为k

......

比较max[0],max[1],max[2],max[....]取最大的记为max1

 

#include <iostream>
using namespace std;
#define N 10

void main(){
int b[N+1];                                 //把输入的数字存储在数组中
int max[N] ,max1,n;                    
int j,k,a,i,g;
max[200] = 0;max1 = 0;
cout<<"please input 10 numbers:"<<endl;
for(j = 0;j<N;j++) cin>>b[j];
for(j = 0;j < N;j++){
a = 0;
for(k = j;k < N;k++){
a+= b[k] ;
if(a>max[j]){
max[j] = a;
n = k;                                //把k的值赋值给n
}
}
if(max[j]>max1){
max1 = max[j];
i = j;
}
}
for(g = i;g < n;g++)
cout<<"连续数组为: "<<b[g]<<" "<<endl;
cout<<"连续数组最大的和为"<<max1<<endl;
}

 

时间复杂度为n2

求最大的和比较容易,主要时间放在了如何把相加和最大的连续数组求出来,关键是如何找到找到相加和最大的连续数组的起止位置。这里用j来表示起始位置,用k来表示止位置

累计用时两个半小时。。。。

推荐阅读