输入:数组个数k,整数数组a[MAXN],整数之间空格隔开。
输出:最大子序和maxsum。
T(n)=O(n2)
#include
#include
#define MAXN 100000 //数组最大空间
int main()
{
int k,i;
int a[MAXN]={0};
scanf("%d",&k);
for(i=0;imaxsum)//取最大值
maxsum=thissum;
}
}
return maxsum;
}
leetcode试题测试
从中间分开,利用子程序递归分别解决左半部分和右半部分最大子序列和,最后解决整体的最大子序列和。
T(n)=T(n/2)+T(n/2)+O(n)=O(nlogn)
#include
#include
#define MAXN 100000 //数组最大空间
int main()
{
int k,i;
int a[MAXN]={0};
scanf("%d",&k);
for(i=0;i=left;i--)
{
leftbordersum+=list[i];
if(leftbordersum>maxleftbordersum)
maxleftbordersum=leftbordersum;
}//左边结束
maxrightbordersum=list[center+1];
rightbordersum=0;
for(i=center+1;i<=right;i++)
{
rightbordersum+=list[i];
if(rightbordersum>maxrightbordersum)
maxrightbordersum=rightbordersum;
}//右边结束
/*返回分治结果*/
return Max3(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);
}
int Max3(int A,int B,int C)//三者求最大
{
return (A>B)?(A>C?A:C):(B>C?B:C);
}
LeetCode试题测试
子序列和出现负数时,提前归零。每输入一个数据及时处理。
遍历一遍数组,所以T(n)=O(n)
#include
#include
#define MAXN 100000 //数组最大空间
int main()
{
int k,i;
int a[MAXN]={0};
scanf("%d",&k);
for(i=0;imaxsum)
maxsum=thissum;/*更新最大值*/
else if(thissum<0)/*子序列和为负*/
thissum=0;/*置0*/
}
return maxsum;
}
LeetCode试题测试
注:有一部分来自网页借鉴,不喜勿碰。