注:微软面试100题系列中的题都是v_JULY_v(http://blog.csdn.net/v_JULY_v)收集的面试题,具体PDF下载地址为:http://download.csdn.net/detail/v_july_v/4583815
写文的目的是锻炼自己,欢迎各位大牛提出建议,批评指正~
第3题:求子数组的最大和
输入一个整型数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值,要求时间复杂度为 O(n)。
例如,输入的数组为1,-2,3,10,-4,7,2,-5,则最大子数组为3,10,-4,7,2,因此输出为该子数组的和18 。
我的思考过程:
- 时间复杂度为O(n),则只能遍历一次数组;
- 记录当前最大值,每遍历一个数就累加到当前和。累加后,当前和与当前最大值做比较,比当前最大值大就替换。如果当前和为负数,那么继续累加也没有意义,因此如果当前和为负数应该丢弃置0,开始新的累加。
代码如下:
//written by zero
#include <iostream>
using namespace std;
int MaxSum(int a[], int size)
{
int sum = 0;
int curMax = -(1 << 31);
for (int i = 0; i < size; ++i)
{
sum += a[i];
if (sum > curMax)
curMax = sum;
if (sum < 0)
sum = 0;
}
return curMax;
}
int main()
{
int a[8] = {1,-2,3,10,-4,7,2,-5};
cout << "max sum of a: " << MaxSum(a,8) << endl;
int b[4] = {-5,8,-1,6};
cout << "max sum of b: " << MaxSum(b,4) << endl;
return 0;
}
运行结果: