本章的内容主要讨论以及实现解决最大子数组的三种不同复杂度的解法
最大子数组问题在生活中有很多应用,本章讨论的问题的背景来源于《算法导论》第四章 4.1最大子数组问题。
注意,我们求的是一个最大子数组,因为最大子数组可能有很多个。求出的是该算法算出的第一个最大子数组。
1、暴力求解 复杂度为Ω(n^2)
对于一个给定的数组,暴力地尝试求和每一个子数组,由于n个数共有n(n-1)/2种组合,而n(n-1)/2=Θ(n^2)。处理每一种组合所花费的时间至少也是常量,所以复杂度为Ω(n^2)。
下面给出代码
#include<cstdio>
int main(void)
{
int i,j,length,first,last;
int sum=0,max=-10000;
int a[1000];
printf("please enter the length of your array\n");
scanf("%d",&length);
printf("Please enter your array\n");
for(i=0;i<length;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<length;i++)
{
sum=0;
for(j=i;j<length;j++)
{
sum=sum+a[j];
if(sum>max)
{
max=sum;
first=i+1;
last=j+1;
}
}