一.题目
返回一个整数数组中最大子数组的和
二.要求
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。 同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)
三.代码
#include <iostream> #define N 1000 using namespace std; int main () { int a[N],n; int sum,max; int begin,last; int i,j,t,k; char status = 'y'; while(status == 'Y' || status == 'y') { cout<<"请输入数组长度n:"<<endl; cin>>n; cout<<"请输入"<<n<<"个数:"<<endl; for (i=0; i<n; i++) { cin>>a[i]; }
//初始化 begin = 0; last = 0; max = 0; for (i=0; i<n; i++) { sum = 0; for (j=i; j<n; j++) { sum += a[j]; if ( sum > max ) { max = sum; begin = i; last = j; } }
for(k=0; k<i; k++) { sum += a[k]; if ( sum > max ) { max = sum; begin=i; last = k; } } } cout<<"最大子数组之和为:"<<endl; cout<<max<<endl; cout<<"最大子数组序列为:"<<endl;
//当最大子数组出现在首尾相接的情况下 if ( last < begin) { for (i=begin; i<n; i++) { cout<<a[i]<<" "; } for (i=0; i<=last; i++) { cout<<a[i]<<" "; } cout<<endl; } else { for (i=begin; i<=last; i++) { cout<<a[i]<<" "; } cout<<endl; } cout<<endl; cout<<"是否继续(是输入y或Y,否输入n或N):"<<endl; cin>>status; } return 0; }
刚开始只是考虑了当i=n-1时进行首尾相连的情况,把k的循环放在了外面,只是从i=n-1的时候才开始尾接首从i=0计算最大子数组
感悟:
当然在第一遍写完程序的时候不仅仅是没有对max、begin、last进行初始化的问题,都是一些小问题,很容易忽视。但是就是这些小问题导致输出结果错误,在编程的世界里不允许有任何的疏忽出现。所以在以后的编程过程中不仅仅要做到认真还要做到考虑周全
还待完善:时间复杂度为O(n^2)
四.测试用例截图