题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
Case1:输入数组:1,-2,3,10,-4,7,2,-5 和最大连续子数组为3,10,-4,7,2 则输出18
Case2:输入数组:3,-2,3,10,-4,7,2,-5 和最大连续子数组为3,-2,3,10,-4,7,2 则输出19
程序写的比较简单,看了网上的知道自己的缺陷:没有考虑输入为空与和最大为0的区别。。。
#include<stdio.h> #include<stdlib.h> void InitArray(int*& A,int M){ A = (int*)malloc(sizeof(int)*M); } int maxSum(int* A,int M){ if(M < 1)//元素个数不符合要求 return 0; if(M == 1)//元素个数为1时,返回A[0] return A[0]; int max = A[0],sum = A[0];//初始最大和为A[0],sum用于计算连续数据和 for(int i = 1; i < M ;i++){ if(sum < 0)//去掉小于0的部分和 sum = 0; sum += A[i];//重新开始计算连续数据和 if(max < sum)//若所得新的连续数据和大于max,则重赋max max = sum ; } return max; } int main(){ int *A, M ; printf("输入元素个数: "); scanf("%d",&M); InitArray(A,M); printf("输入%d个元素 ",M); for(int i = 0; i < M; i++){ scanf("%d",A + i); } printf("最大和是:%d ",maxSum(A,M)); free(A); }