输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
使用三种方式实现,分别是蛮力法:bf_MaxSubArray,分治法:dc_MaxArray,和O(n)实现的单循环法find_max。
#include"stdio.h"
#include"math.h"
#include"time.h"
#include"windows.h"
#define MIN_INT -10000
#define MAX_INT 10000
typedef struct{
int max_left;
int max_right;
int max;
}maxinfo;
maxinfo bf_MaxSubArray(int *a,int n)
{
maxinfo max;
max.max_left= 0;
max.max_right= 0;
max.max= MIN_INT;
int tmp=0;
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
tmp += a[j];
if(tmp > max.max)
{
max.max = tmp;
max.max_left = i;
max.max_right = j;
}
}
tmp = 0;
}
return max;
}
maxinfo dc_FindMaxCrossingSubArray(int *a,int left,int mid,int right)
{
maxinfo leftMax;
leftMax.max_left= mid;
leftMax.max_right