//问题描述:有一个数组假如A[10] = {45, 23, -67, 12, -33, -54, //23, 71, -10, 18 },现在要求出A数组中从下标i到j的子数组和最大值, //其中i,j都在[0, 10)之间,i <= j; //如上所述,A数组中的最大和应该是102,下标i = 6, j = 9; //使用线性扫描的算法,时间复杂度为O(n); #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 10 typedef struct MAX { int sum; int start; int end; }SumArr; /* 总和数据类型 */ void maxArray(int *iArr, int len, SumArr *max); int main(int argc, char **argv) { int iArr[ N ]; int i; SumArr max; for ( i = 0; i < N; i++ ) { scanf("%d", &iArr[ i ]); } memset(&max, 0, sizeof(max)); maxArray(iArr, 10, &max); printf( "%d %d %d/n", max.sum, max.start, max.end ); return 0; } void maxArray(int *iArr, int len, SumArr *max) { int i; SumArr maxtmp; /* 存储可能的最大和 */ memset(&maxtmp, 0, sizeof(maxtmp)); /* 线性扫描数组中每个元素,时间复杂度为O(n) */ for ( i = 0; i < len; i++ ) { if ( (maxtmp.sum = maxtmp.sum + iArr[ i ]) > 0 ) { maxtmp.end = i; /* 记录结束下标,记录当前最大和的结束下标 */ } else { maxtmp.start = i + 1; /* 如果最大和小于0的话,那前面的所有都要丢弃,开始下标从下一个开始 */ maxtmp.sum = 0; } if ( maxtmp.sum > max->sum ) /* 如果可能的最大和大于先前的最大和,那么就将此值赋值给max */ { memcpy(max, &maxtmp, sizeof(maxtmp)); } } }