课堂练习----一个整数数组中最大子数组的和(1)

本文探讨了一个在给定整数数组中寻找最大子数组和的问题,并提供了使用贪心算法解决此问题的详细步骤。通过实例分析,解释了如何在O(n)的时间复杂度内找到最大子数组和,同时分享了结对开发的经验和项目计划总结,强调了团队合作的重要性。

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

要求:
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 Array[N];
    int firstNum=0,lastNum=0;
    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=value;
            lastNum=i;
        }
        if(value<0)
        {
            value=0;
            firstNum=i+1;
        }
    }
    if(max==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;
}

实验总结:本项目看上去不是太复杂,但是非常讲究算法,两个人结对开发,一起讨论,一起想解决方案,一起网上查找算法,更加锻炼了结对开发的能力。

项目计划总结:

日期&&任务听课编写程序阅读相关书籍网上查找资料日总计
周一100252515165
周二 30352590
周三 601535110
周四100303025185
周五 180 15195
周六  601575
周日  15 15
周总计200325180130835

时间记录日志  

 

日期开始时间结束时间中断时间净时间活动备注
3/2114:0015:5010100听课软件工程上课
 17:1017:20 10阅读书籍《构建之法》《梦断代码》
 21:0021:25 20网上查找资料 
3/2214:0015:0010110结对编程编写老师布置的作业
 16:0017:0010110看书《构建之法》《梦断代码》
3/2321:0021:30 30结对编程编写老师布置的作业
3/2414:0015:5010100听课软件工程上课
3/2516:0018:00 120结对编程编写老师布置的作业
3/269:009:30 30看书《构建之法》《梦断代码》
3/279:009: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/

 

转载于:https://www.cnblogs.com/GloryYT/p/5322943.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值