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

    题目:

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

    要求:

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

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

        如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。

        同时返回最大子数组的位置。 求所有子数组的和的最大值。

    设计思想:

        这个题目是在上个题目的基础的加上数组首位相连,并该数组最大子数组的和,实现方法就是把环变成直线的方法,通过for循环,在每次循环中,把数组中的元素作为数组的起始位置,并把后面的元素依次放到另外一个数组中。对于新生成的数组,通过上一次的方法求出新数组的最大子数组的和,然后通过比较所有数组的最大子数组和,求出初始数组最大子数组的和。

    2 4 7 -10

    4 7 -10 2

    7 -10 2 4

    -10 2 4 7

    代码:

    #include<iostream>
    using namespace std;
    #define N 100
    int main()
    {
        int p,num,value,max,count=0;     
        int val[N];                                      //原始数组
        int Array[N];                                      //存放新生成的数组
        int ArrayMax[N];                                   //存放每个数组最大值
        int ArrayFisrtLast[N][N];                          //存放最大子数组的每个元素
        int ArrayNum[N][N];                               //存放最大子数组元素的个数
        cout<<"输入数的个数:";
        cin>>num;
        for(int i=0;i<num;i++)                             //输入元素
        {
            cin>>val[i];
        }
        for(int i=0;i<num;i++)
        { 
            int firstNum=0,lastNum=0,q=0;                   //最大子数组开始位置(firstNum),结束的位置(lastNum)
            value=0;
            p=i;
            for(int k=0;k<num;k++)                           //重新开辟一个新数组Array,存放以原始数组的每个元素开头的数组
            {
                p=p%num;
                Array[k]=val[p];
                p++;
            }
            max=0;
            for(int j=0;j<num;j++)                              //找出最大子数组
            {
                value=value+Array[j];  
                if(value>max)                                      //累加和大于max,累加和赋值给max              
                {
                    max=value;
                    lastNum=j;
                } 
                if(value<0)                                // 当前和小于0,重置为0  
                {
                    value=0;
                    firstNum=j+1;
                }
            }
            if(max<0)                                 // 最大和依然为0,说明数组中所有元素都为负值
            { 
                max=val[0];
                firstNum=0;
                lastNum=0;
                for(int j=0;j<num;j++)
                {
                    if(max<Array[j])
                    {
                        max=val[j];
                        firstNum=j;
                        lastNum=j;
                    }
                }
            }
            ArrayMax[count]=max;
            for(int m=firstNum;m<=lastNum;m++)
             {
                ArrayFisrtLast[count][q]= Array[m];
                q++;
            }
            ArrayNum[count][0]=lastNum-firstNum+1;
            count++;
        }
        max=ArrayMax[0];
        int n=0;
        for(int i=0;i<count;i++)
        {
            if(max<ArrayMax[i])
            {
                max=ArrayMax[i];
                n=i;
            }
        }
        cout<<"最大子数组是:";
        for(int i=0;i<ArrayNum[n][0];i++)
        {
            cout<<ArrayFisrtLast[n][i]<<" ";
        }
    
        cout<<endl;
        cout<<"最大子数组的和为:";
        cout<<max<<endl;
        return 0;
    }

    截图:

     

    总结:更加熟悉了数据结构与算法的学习,认为这门课程是非常重要的基础,要好好学习多加练习,更加熟悉两个人的结对开发,一起讨论,一起想解决方案,一起网上查找算法,更加锻炼了结对开发的能力。

    项目计划总结:

    日期&&任务 听课 编写程序 阅读相关书籍 网上查找资料 日总计
    周一 100 25 25 15 165
    周二   30 35 25 90
    周三   60 15 35 110
    周四 100 30 30 25 185
    周五   180   15 195
    周六     60 15 75
    周日     15   15
    周总计 200 325 180 130 835

    时间记录日志  

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    3/21 14:00 15:50 10 100 听课 软件工程上课
      17:10 17:20   10 阅读书籍 《构建之法》《梦断代码》
      21:00 21:25   20 网上查找资料  
    3/22 14:00 15:00 10 110 结对编程 编写老师布置的作业
      16:00 17:00 10 110 看书 《构建之法》《梦断代码》
    3/23 21:00 21:30   30 结对编程 编写老师布置的作业
    3/24 14:00 15:50 10 100 听课 软件工程上课
    3/25 16:00 18:00   120 结对编程 编写老师布置的作业
    3/26 9:00 9:30   30 看书 《构建之法》《梦断代码》
    3/27 9:00 9:30   30 看书 《构建之法》《梦断代码》

    缺陷记录日志:

           

    日期 编号 类型 引入阶段 排除阶段 修复时间 修复缺陷
    3月22日 1   编码 编码 0.2min  
      缺少头文件
      2   编码 运行 3min  
      重复使用变量i,导致无限运行
    3月25日 3   编码 编译 1min  
      if条件中用了“=”运算符
      4   编码 编译 1min  
      缺少;
      5   编码 编译 0.2min  
      for的结尾再次使用i++,导致i加了两次

    小组成员:杨超群 http://www.cnblogs.com/linumy/

  • 相关阅读:
    flex布局中transform出错
    RabbitMQ系列之Centos 7安装RabbitMQ 3.6.1
    解决windows下FileZilla server中文乱码问题
    IIS 7.5 + PHP-5.6.3 + mysql-5.6.21.1
    C# 速编神器LinqPad(新版6.5)
    一个MySql Sql 优化技巧分享
    IIS反向代理/Rewrite/https卸载配置
    zerotier 远程办公方案
    一次Mysql连接池卡死导致服务无响应问题分析(.Net Mysql.Data 6.9.9)
    ExpressCache
  • 原文地址:https://www.cnblogs.com/GloryYT/p/5322996.html
Copyright © 2011-2022 走看看