一、实验题目
题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有整数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n).
二、实验思路
由于这次所要求的子数组相当于一个环形的数组,所以就想到了类似数字右循环的形式来解决这个题目。(其实主要思想是参考的课堂上一个同学的思想)
下面我用一个例子来说明一下我们的解题思路:
例如,我输入的数组是{5,-3,2,-1}第一次循环求得5,和max比较大小,然后把5+(-3)和max比较大小,然后是5+(-3)+2和max比较大小,最后是5+(-3)+2+(-1)和max比较大小,把最大值给max,接下来把5移到-1的后面,再用同样的方法求第二次循环的最大值,只不过这次开始于-3。依次类推,求出最大的子数组。
由于我和小伙伴编程不是太好,所以返回最大子数组的位置这一个要求没有实现。
三、源代码
1 // 信1201-2班 司新红 万彤 2 #include"stdafx.h" 3 #include "iostream" 4 using namespace std; 5 6 /*主函数*/ 7 int main() 8 { 9 int length;//定义数组长度length 10 int n;//定义变化后的数组的长度 11 cout<<"请输入数组元素个数:"<<endl; 12 cin>>length; 13 n=2*length; 14 int* a=new int[n];//初始化数组 15 cout<<"请输入数组中的元素:"<<endl; 16 for(int i=0;i<length;i++) 17 { 18 cin>>a[i]; 19 } 20 int max=a[0]; 21 int s=0;//定义求和后的元素 22 for(int i=0;i<length;i++) 23 { 24 s=0; 25 for(int j=i;j<length+i;j++) 26 { 27 s=s+a[j]; 28 if(s>max) 29 { 30 max=s; 31 } 32 } 33 a[length+i]=a[i]; //每次将已经计算过的数放到最后 34 } 35 cout<<endl; 36 cout<<"最大子数组的和为:"<<endl; 37 cout<<max<<endl; 38 39 return 0; 40 }
四、运行结果
五、心得体会
这次的程序,在我刚刚看到的时候,简直一点思路都没有,所以最后采取的课堂上一个同学的思路,在编程的过程中我们还遇到了许多的问题,比如不知道如何把第一个数字移到数组的最后面,后来经过问同学,和我们自己的研究终于得到了解决。虽然我和我的小伙伴都不太会编程,但是我们还是努力完成了这个题目,也许这就是一点点的进步吧,在以后的过程中,我们会再接再厉,争取能够独立完成一个程序。
附上我和我的小伙伴的照片:
原文:http://www.cnblogs.com/zgsxh/p/4376505.html