zoukankan      html  css  js  c++  java
  • 课堂练习----一个整数数组中最大子数组的和(1)

    本次的题目是:返回一个整数数组中最大子数组的和

    要求:
    1.输入一个整形数组,数组里有正数也有负数。
    2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    3.求所有子数组的和的最大值。要求时间复杂度为O(n)

    分析:

    当我们求出的累加和加上一个正数的时候,整个累加和就会增加,当我们的累加和加上一个负数的时候,整个累加和就会减小,我们用一个变量max保存累加和的最大值,另外,我们的累加和如果为负数的时候,如果继续加数不把累加和清零的话,那么整个和就会减小,因此如果累加和为负,就把累加和清零,最后,起初的max值为0,如果循环完后max的值继续为0,则说明数组里的数,全为负数,全为0,有0有负数。那么只需要求数组最大值即可。

    #include<iostream>
    using namespace std;
    #define N 1000
    int main()
    {
        int num,value,max=0;
        int val[N];
        int firstNum=0,lastNum=0;              //最大子数组开始位置(firstNum),结束的位置(lastNum)
        cout<<"输入数的个数:";
        cin>>num;
        for(int i=0;i<num;i++)
        {
            cin>>val[i];
        }
        value=0;
        for(int i=0;i<num;i++)                 //找出最大子数组
        {
            value=value+val[i];
            if(value>max)                    //累加和大于max,累加和赋值给max   
            {
                max=value;
                lastNum=i;
            }
            if(value<0)                       // 当前和小于0,重置为0  
            { 
                value=0;
                
                firstNum=i+1;
            }
        }
        if(max==0)                    // 最大和依然为0,说明数组中所有元素都为负值
        {
           max=val[0];
           firstNum=0;
           lastNum=0;
           for(int j=0;j<num;j++)
           {
               if(max<val[j])
               {
                   max=val[j];
                   firstNum=j;
                   lastNum=j;
               }
           }
        }
        cout<<"最大子数组是:";
        for(int i=firstNum;i<=lastNum;i++)
        {
            cout<<val[i]<<" ";
        }
        cout<<endl;
        cout<<"最大子数组的和为:";
        cout<<max<<endl;
        return 0;
    }

    结果截图:

    小组成员:杨涛  http://www.cnblogs.com/GloryYT/

  • 相关阅读:
    2019年第九周作业
    2019年春第八周作业
    2019年春第七周作业
    2019春第六周作业
    2019年春季学期第五周作业
    2019年春季学期第四周作业
    2019年春季学期第三周作业 ----PTA作业
    2019年春季学期第三周作业
    2019春第七周作业
    第五周作业
  • 原文地址:https://www.cnblogs.com/linumy/p/5318125.html
Copyright © 2011-2022 走看看