最大子列和问题
1.暴力法(列出所有可能,选取其中最大的)
public static int Baoli(int A[],int n)
{
int thisSum,MaxSum=0;
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
thisSum=0;
for(int k=i;k<=j;k++)
{
thisSum+=A[k];
}
if(thisSum>MaxSum)
MaxSum=thisSum;
}
}
return MaxSum;
}
很不聪明的一个算法,算法复杂度为n的立方,当数量级很大时,消耗的时间很多。
2.改进版
public static int f2(int A[],int n)
{
int thisSum,MaxSum=0;
for(int i=0;i<n;i++)
{
thisSum=0;
for(int j=i;j<n;j++)
{
thisSum+=A[j];
if(thisSum>MaxSum)
MaxSum=thisSum;
}
}
return MaxSum;
}
时间复杂度为n的平方
3.分治法
在这里插入代码片
分治法怎样思考这道题呢?
将子列从中间分为2部分,递归的解决左右两边的问题,得到两个字列和,再加上一种跨越边界的最大子列和,那么结果一定是三个数中最大的一个。
时间复杂度为nlogn
4.在线处理算法
public static int f4(int A[],int n)
{
int thisSum=0,MaxSum=0;
for(int i=0;i<n;i++)
{
thisSum+=A[i];
if(thisSum>MaxSum)
MaxSum=thisSum;
else if(thisSum<0)
thisSum=0;
}
return MaxSum;
}
在线,每输入一个数据就进行及时处理,在任何一个地方中止输入,算法都能正确给出当前解
时间复杂度为n