首尾相连一维数组最大子数组(一)

一.题目

    返回一个整数数组中最大子数组的和

二.要求

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    如果数组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)

四.测试用例截图

 

posted @ 2015-04-11 11:53  hy叶子  阅读(257)  评论(1编辑  收藏  举报