结对开发——返回整数数组最大子数组和
……二柱子的问题终于可以让我们喘口气了(虽然还要写出单机版或者网页版)……
这次题目的要求还是结对开发,题目:返回一个整数数组中最大子数组的和
要求如下:
1、输入一个整型数组,数组里有正数也有负数;
2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
3、求所有子数组的和的最大值,要求时间复杂度为O(n);
一、实验设计思想
这个实验还是结对开发的项目,由于上周我和孔同学已经合作过一次了,所以这次明显顺利许多,周三下午就能够实现基本的功能了……(也许是因为这次的题目比较简单ค(TㅅT))
经过上课听老师帮我们分析、同学去前面演说思路以及搜集资料,我们得知这个是一个很多公司或考研复试的经典问题了……所以我们也阅读了网上有关这个问题的思路。当然在这之前我们只能想到的就是最笨的方法(。・・)ノ,就是将用户输入的值存入数组后,按照某种顺序依次计算每个子数组的和,得到不同的排列方式下的最大子数组和,最后再比较输出最大值。显然这种方法代码量会很长,而且不符合老师对于时间复杂度的要求。(根据思路我在尝试着写出这样的程序,如果╮(╯_╰)╭本周还有时间我会上传到博客上……)
本次实验面对的两个问题是:
一是如何让用户随意输入一定范围内的整数数组,最后以回车或者某个结束符结束,然后程序可以读出用户输入的数组元素个数进行运算。为解决这个问题,我想起了在编写“二柱子”程序时候我曾经跟室友讨论过的“本应该输入选项0或1的如果用户不小心输入字符怎么办”的问题,室友的编程思维很严谨,我记得她当时说到了关于getchar()函数的问题,于是我又去百度了一下,然后将其成功加入了我们的程序中。我成功的解决了第一个问题。
那么另一个问题也是最重要的问题就是如何避免使用“最笨的“方法,使程序的时间复杂度为O(n)。孔同学参考CSDN上的博文解决了这个问题,并向我解释了这个思想的原理,之后我们独立写出了程序。首先,当某一段子数组的和为负数时,就没有继续加下去的必要,将出现负数和之前的那个最大和用b表示出来,而新的子数组从出现负数和最后一位的下一位开始;然后再单独考虑所有的数都是负数的情况,即为数组中最大负数值(后来我发现这个问题不用考虑,题目要求数组中有正数也有负数……)第二个问题也被孔同学解决了(′▽`〃)
(CSDN博客链接:http://blog.csdn.net/ns_code/article/details/20942045)
二、实验源代码
源代码如下:
1 //返回一个整数数组中最大子数组的和 2 //孔宇航,赵子茵 2016/3/21 3 4 #include<iostream> 5 using namespace std; 6 7 int main() 8 { 9 int arr[1000]; 10 int i, MaxSum = 0, max, sum = 0, num = 1, count = 0; 11 /*MaxSum是子数组最大和 12 max是整数组的最大值 13 sum是子数组的和 14 num是元素个数 15 count是元素中负数的个数*/ 16 cout << "请输入一个整数数组(不超过1000个):" << endl; 17 cin >> arr[0]; 18 while (getchar() != ' ') 19 { 20 cin >> arr[num]; 21 num++; 22 } 23 24 for (i = 0; i < num; i++) 25 { 26 if (sum < 0) 27 sum = arr[i];//当子数组和小于0时,与无论与后面数组如何相加,和肯定小于后一段数组之和,此时,将b重新赋值,置为下一个元素 28 else 29 sum += arr[i]; 30 if (MaxSum < sum) 31 MaxSum = sum; 32 } 33 34 max = arr[0];//d记录数组中的最大元素值 35 for (i = 0; i<num; i++) //如果数组全为负数,最大子数组和就是数组中最大值 36 { 37 if (arr[i]<0) 38 count++; 39 if (arr[i]>max) 40 max = arr[i]; 41 if (count == num) 42 MaxSum = max; 43 44 } 45 cout << "子数组的最大和为:" << MaxSum << endl; 46 return 0; 47 48 }
实验结果截图:
三、实验总结
通过这次结对合作,我越来越意识到两个人之间的正当合作会使工作达到事半功倍的效果。在本次实验中我们分别解决了一个关键问题,并将思路很好的传达给对方,增长了知识。然后关于编程,我觉得以后我们也会遇到类似的问题,我们要学会使用简单的方法来解决问题,不要有“反正我做出来了,你管我用什么方法呢”这样的方法,我们要有意识的
锻炼自己的逻辑思维、提高编程的效率。在编写程序之前多思考、多与同学讨论、多阅读好的思想和方法,并融入到自己的程序中。加油!!(~o ̄3 ̄)~
附:孔同学的博客主页 http://www.cnblogs.com/kongyuhang/