要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。
思路:
如输入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来表示止位置
累计用时两个半小时。。。。