软件工程课堂练习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),还不是很理想,有很大的改进空间。不过经历这次结对编程,也使我和我的小伙伴关系更好了一些,处理问题有了更高层次的提升,遇见问题,讨论问题,解决问题。我们一定会做的越来越好的。

 

posted @ 2014-03-10 20:16  徐梦迪迪  阅读(181)  评论(3编辑  收藏  举报