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