软件工程课堂练习2

2013年3月10日上午11:00

题目:输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。

这是我们这一次是测试内容。刚刚老师耐心的给我们讲解了什么是子数组,这是非常经典的一道题。想要实现这个程序不难,只是能够很巧妙的把时间复杂度降为O(n)才是解题的关键。

下面是我们结对pair的初级设计思路:

1、键盘输入数组个数、数组元素。用cin实现

2、实现一个for循环,找到以数组中第一个数为首的子数组的和

定义一个变量sum并赋一个初值作为子数组的和,在定义一个max实现子数组最大值的存储

刚开始想着定义一个数组add[]来放子数组和,然后通过子数组和的大小比较来实现max的查找。后来发现设置的子数组最大值查找时没有嵌套进循环而使max一直等于a[0].

后来两人协商之后,决定直接用sum来作为子数组和,经过两个嵌套循环,内层for循环实现从i=j+1到i=n的子数组和sum的计算,通过if实现max和sum的比较,把较大的值赋给max。循环出来的就是a[0]为子数组第一个元素的max值。

3、外层嵌套一个for循环,经过j=0到j=n的遍历,找到最终结果max

4、输出结果

分析过程如下:

 

下面是我们的代码: 

#include<iostream>
using namespace std; 
int main(int argc, char* argv[])
{
    int a[10];
    int max=a[0];
    int i,j,n,sum=0;
    cout<<"输入数组个数:"<<endl;
    cin>>n;
    cout<<"输入数组元素:"<<endl;

    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for(j=0;j<n;j++)
    {
        sum=a[j];
        for(i=j+1;i<n;i++)
        {    
            sum=sum+a[i];
            if(max<sum)
            max=sum;
        }
    }
    cout<<max;
    
    return 0;
}

 这个程序只是单纯的实现了求最大子数组和功能,时间复杂度是O(n^2),还不是很理想,有很大的改进空间。不过经历这次结对编程,也使我和我的小伙伴关系更好了一些,处理问题有了更高层次的提升,遇见问题,讨论问题,解决问题。我们一定会做的越来越好的。

 

转载于:https://www.cnblogs.com/mengdi/p/3592594.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值