题目:返回一个整数数组中最大子数组的和。
要求:1、输入一个整型数组,数组里有正书和负数。
2、数组中连续的一个或者多个整数组,每个子数组都有一个和。
3、求所有子数组的和的最大值。要求时间复杂度为0(n)。
设计思想:
1、定义一维数组,为实现可以输入任意多个值在此处用到vectors容器。
2、输入
3、实现方法:从两头进行。以数组的前端为例,比较下标为0与下标为1的两个元素进行比较选择,若下标为0的元素的数值小于0则直接舍弃,若大于零则将该元素的值与下标为1的元素相加并赋值给下标为1的元素,在进行循环。
程序代码:
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int t; int a; int max; vector<int>ivec1;//创建vector对象 vector<int>::size_type iz;//数组的程度为iz; cout << "请输入一组数:" << endl; while(cin>>a) { ivec1.push_back (a); if(getchar()==' ') break; } iz=ivec1.size(); cout << "数字元素的个数:" << iz << endl; for(int i = 0;i < iz/2;i++) { if(ivec1[i] < 0) { t = ivec1[i+1]; } if(ivec1[i] > 0) { t = ivec1[i] + ivec1[i+1]; } ivec1[i+1] = t; } for(int i = iz-1;i > iz/2+1;i--) { if(ivec1[i] < 0) { t = ivec1[i-1]; } if(ivec1[i] > 0) { t = ivec1[i] + ivec1[i-1]; } ivec1[i-1] = t; } if(ivec1[iz/2]>=0) { max = ivec1[iz/2] + ivec1[iz/2+1]; } else max = ivec1[iz/2+1]; cout << "最大"<< max ; return 0; }
运行结果截图:
反思总结:这个程序仅仅是考虑了最大值时正数的情况;
遇到的问题:
1、随意输入任意个整型数字(用vectors容器)
2、定义变量max比较存储最大值(开始被忽略了)
3、筛选时要从两头进行。
4、有些情况不能正常运行。