20180602
题目:
输入一个整型数组,数组里面有正数也有负数。数组中的一个或连续多个整数组成自一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n)
解题思路:
解法一:举例分析数组的规律
例如输入的数组为{1,-2,3,10,-4,7,2,-5},则计算步骤如下:
1.初始化和
为0,最大子数组和
为0,第一步加上数字1,
为1,
为1
2.第二步加上数字-1,和变成了-1,此时最大子数组的大小为第一步中的1,即
为1,并且-1对之后子数组的和没有帮助,舍弃,即
归0。
3.第三步加上3,
为3,
为3
4.第四步加上10,
为13,
为13
5.第五步加上-4,
为9,对后面的子数组和有帮助,
仍然为13
6.第六步加上7,
为16,
为16
7.第七步加上2,
为18,
为18
8.第八步加上-5,
为13,
为18
9.结果为18
可以AC的代码(C++版本)
#include <vector>
#include <iostream>
#include <stdlib.h>
using namespace std;
int FindGreatestSumOfSubArray(vector<int> array)
{
int size = array.size();
if(size <= 0)return 0;
int sum = array[0],resu = array[0]; //把sum和最后结果的resu初始化为第一个元素
for(int i = 1;i != size;i++){
if(sum < 0) //如果sum的值小于0,把其置零
sum = 0;
sum += array[i];
if(sum > resu)
resu = sum;
}
return resu;
}
int main()
{
vector<int> test{1,-2,3,10,-4,7,2,-5};
cout << FindGreatestSumOfSubArray(test) << endl;
return 0;
}
解法二:应用动态规划算法
用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出
,其中
。而其中f(i)的计算公式如下:
可以AC的代码(C++版本)
和解法一的代码都差不多吧
#include <vector>
#include <iostream>
#include <stdlib.h>
using namespace std;
int FindGreatestSumOfSubArray(vector<int> array)
{
int size = array.size();
if(size <= 0)return 0;
int preSum = array[0],sum,resu = array[0];
for(int i = 1;i != size;i++){
if(preSum < 0) //这里主要体现动态规划的思想,实现动态规划函数
preSum = array[i];
else
preSum += array[i];
if(preSum > resu)
resu = preSum;
}
return resu;
}
int main()
{
vector<int> test{1,-2,3,10,-4,7,2,-5};
cout << FindGreatestSumOfSubArray(test) << endl;
return 0;
}