您的位置:首页 > 编程语言

微软编程题之求子数组的最大和

2017-05-02 11:07 281 查看
题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。

算法思想:每次加上数组中的一个正数时,和会增加,加上一个负数时,和会减小。如果当前的得到的和是一个负数,则应该清零,不然在接下来的累加中,它会减小当前的和。

代码很简单:

#include<iostream>
using namespace std;

void MaxSubArray(int arr[],int size)
{
int i=0;
int sum=0;
int max=-1000;
if(size<=0)
{
cout<<"array input error!"<<endl;
}
while(i<size)
{
sum+=arr[i++];
if(sum>max)
{
max=sum;
}
else if(sum<0)
{
sum=0;
}
}
cout<<max<<endl;
}

int main()
{
int array[8]={1,-2,3,10,-4,7,2,-5};
MaxSubArray(array,8);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: