首页 > 技术文章 > 一维数组最大子数组(二)

hongyedeboke 2015-04-07 22:29 原文

一.题目要求

   返回一个整数数组中最大子数组的和。
 要求程序必须能处理1000 个元素;
   每个元素是int32 类型的;
   输入一个整形数组,数组里有正数也有负数。
 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
 求所有子数组的和的最大值。

二.代码

#include<iostream>
#include<ctime>
#include<stdlib.h>
#define N 100000
using namespace std;
void main()
{
    long long begin;//子序列的开头
    long long end;//子序列的结尾
    long long newsum;//当前子序列最大值
    long long maxsum;//子序列最大值
    srand((unsigned)time(NULL));//生成随机数
    long long a[N], i, n;
    /*begin = 0;
    end = 0;*/
    newsum = 0;//初始化
    maxsum = a[0];//初始化
    cout << "请输入数组里面包含数的个数:" << endl;
    cin >> n;
    for (i = 0; i < n; i++)
    {
        a[i] = rand() % 21 - 10;
    }
    cout << "数组a[" << n << "]为:";
    for (i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
 
    for (i = 0; i<n; i++)//开始循环求子序列和
    {
        newsum = newsum + a[i];
        if (newsum > maxsum)//更新当前子序列的和
        {
            maxsum = newsum;
            end = i;
        }
        if (newsum < 0)//假若当前子序列和为负,则舍弃
        {
            begin = i + 1;
            newsum = 0;
 
        }
    }
    cout << "最大的子序列和为:" << maxsum << endl;
    cout << "最大的序列为:";
    for (long long k = begin; k <= end; k++)
    {
        cout << a[k] << " ";
    }
    cout << endl;
 
}

 

 

思路:
这是扫描法,从第一个开始记和开始到最后一个数,用maxsun记最大的和,但是有两个问题:1.在这个程序里计算子数组是错误的,比如到第五个数是最大的,但是加上第六个就是负数,那么子数组最开始就是改为第七个数开始;2.每个数都是在rand()%21-10之间,但不是任何一个数,整个的和没有超过int的范围,所以不存在溢出的问题,即没有真正解决溢出的问题。
 

推荐阅读