Q:给一个数组,返回它的最大连续子数组和
例如:
输入:{6,-2,-3,8,-15}
返回:9
方法一:
思路:
- 使用动态规划
- 用sum记录当前子数组的和,res记录最大子数组的和
- 如果sum+当前元素的值小于当前元素本身值,证明之前的子数组和对该元素没有贡献,所以从该元素开始重新记录,如果大于当前元素值则证明有贡献,继续向后记录
- res是当前子数组和与之前记录的最大值中较大的
画图:
代码:
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int sum=array[0];
int res=array[0];
for(int i=1;i<array.size();++i)
{
sum=max(array[i],array[i]+sum);
res=max(res,sum);
}
return res;
}
};
方法二:
思路:
- 用sum记录当前子数组的和,res记录最大子数组的和
- 如果sum<0,则加上当前元素值一定会让结果变小,因此从sum=该元素的值,继续向后记录
- 每次循环后比较res和sum的值,较大的值成为新的res
代码:
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int sum=array[0];
int max=array[0];
for(int i=1;i<array.size();++i)
{
if(sum>=0)
sum+=array[i];
else
sum=array[i];
if(sum>max)
max=sum;
}
return max;
}
};