题目:
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
#include <iostream>
using namespace std;
void main()
{
int a[]={1,-8,6,3,-1,5,7,-2,0,1};
int num=sizeof(a)/sizeof(int);
int max=0,sub=0;
//题目中说明有正负值的存在,所以逻辑可以简化很多
for(int i=0;i<num;i++)
{
sub+=a[i];
//如果子数组小于零,舍弃该子数组,重新寻找
if(sub<0)
{
sub=0;
continue;
}
//每次记录最大值
if(sub>max)
max=sub;
}
cout<<max<<endl;
getchar();
}
上述是我编写的源代码,由于程序较为简单所以未将逻辑独立在子数组中。这题算微软放水的题了。