数组1
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)
设计思想:
子数组求最大和的话,如果数组中既有整数也有负数,那么最大值一定不能是负数,所以如果所求和小于0的话就抛弃,如果为正则继续累加,而且只有当当前的数字为正时,此时的求和才能是目前的最大值。考虑到都为0的情况,则必须在其中找到最大值,不能为0。
//禹慧慧 吕兰兰 2016.3.23 //求一个数组中最大子数组的元素之和 #include<iostream> using namespace std; int main() { int a[100],N;//数组元素个数 int sum=0,max=0; cout<<"请输入数组元素个数:"; cin>>N; cout<<"请输入"<<N<<"个数:"; for(int i=0;i<N;i++) cin>>a[i]; for(int i=0;i<N;i++) { sum+=a[i];//求和 if(a[i]>=0) { if(max<sum) { max=sum;//赋值给最大和 } } if(sum<0) { sum=0; } } if(max==0)//数组元素都为负数的情况 { max=a[0]; for(int i=1;i<N;i++) { if(a[i]>max) max=a[i]; } } cout<<"最大子数组和为:"<<max<<endl; return 0; }
运行结果:
总结:
这道题难得不在于结果的实现,难点在时间复杂度,如果不规定时间复杂度的话,只要使用循环嵌套很容易实现,但是时间复杂度为O(n),那么只能使用一层嵌套,然后通过选择语句进行比较、赋值,不过一定要记得考虑极端情况。
组成员吕兰兰网址:http://www.cnblogs.com/lvlan/