1.连续最大和
题目
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。
题目分析
法一:可以找出规律,如果当前和小于0,那么可以把这个当前值抛弃,因为加上一个负数(包括0)还不如不加,把当前数设置为当前和。如果当前和是正数,则把当前数加进去更新当前和,这个时候判断下当前和是否大于最大连续和,是的话就更新最大连续和,否则,不更新最大连续和,只更新当前和。需要注意的是:需要设置一个布尔变量,判断是因为输入无效数据返回的0还是本身最大连续和就是0.
法二:用动态规划的算法。用f(i)表示第一个数字结尾的子数组的最大和,那么我们需要求出max{f(i)},其实0<=i<=n。然后用递归来解。代码同法一是一样的,max[f(i)]就是greatsum,f(i)就是cursum。
f(i) =data[i] i==0 || f(i-1)<=0
=f(i-1)+data[i] i!=0 && f(i-1)>0
代码
#include<iostream>
using
namespace
std;
#include<vector>
bool
g_invalid=
false
;
//判断返回值为0 还是因为是无效数据返回的0
int
getMax(vector<
int
> nums,
int
n)
{
if
(n<=0)
{
g_invalid=
true
;
return
0;
}
g_invalid=
false
;
int
cursum=0;
int
greatsum=0x80000000;
for
(
int
i=0;i<n;i++)
{
if
(cursum<=0)
cursum=nums[i];
else
cursum+=nums[i];
if
(cursum>greatsum)
greatsum=cursum;
}
|