求子数组的最大和(数组)
题目:
输入一个整型数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值 。要求时间复杂度为O(n)
例如:输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2.因此输出为该子数组的和18.
当我做这道题的时候,想到了看过的电影21点,里面每个牌对结果都有一个影响因子,+或者-。同样的,当子数组的和为正的时候,为后面的数组提供的正影响因子,当时负的时候,是负影响因子,所以这时候应该舍弃负的子数组,重新开始。再结合贪心算法的思想。另外这里的初值设定很是巧妙,刚开始我也没有想到,是看了答案才改的,这样很好的解决了都是负数的数组情况。
代码如下:
#include <iostream>
using namespace std;
int maxArray(int array[],int size)
{
int max=-(1<<31),sum=0;
//cout<<max<<endl;
for (int i=0 ; i<size ; ++i)
{
sum += array[i];
if(sum<0)
sum=0;
if(sum>max)
max=sum;
}
return max;
}
void main()
{
int array[8] = {1,-2,3,10,-4,7,2,-5};
cout<<maxArray(array,8)<<endl;
system("pause");
}