题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每一个子数组都有一个和。求全部子数组的和的最大值。要求时间复杂度为O(n)。算法
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,所以输出为该子数组的和18。数组
思路一:暴力穷举
spa
思路二:分治法(代码还有错误,就不贴出来了.....好对不起算法老师!)3d
思路三:我也不知道怎么阐述。直接看代码吧code
思路四:动态规划get
代码以下(GCC编译经过):io
#include "stdio.h" #include "stdlib.h" #define MAXSIZE 8 int main(void) { //int array[MAXSIZE]={1,-2,3,10,-4,7,2,-5}; int array[MAXSIZE]; int i; srand((unsigned)time(NULL)); for(i = 0;i<MAXSIZE;i++) { array[i] = rand()%101; if(rand()%2) array[i] *= -1; printf("%3d",array[i]); } printf("\n%3d\n",getMaxSum(array,MAXSIZE)); return 0; } //思路一: int getMaxSum(int array[],int n) { int max,sum,i,j; max = -(1 << 31); printf("%d\n",max); for(i = 0;i<n;++i) { sum = 0; for(j = i;j<n;++j) { sum += array[j]; if(sum > max) { max = sum; } } } return max; } //思路三 int getMaxSum(int a[],int n) { //sum统计的是遍历过的最大和。所以若为整数则继续累加,若为负数则忽略。 int sum =0; int max = -(1<<31); int i; for(i = 0;i<n;i++) { sum += a[i]; if(sum >max) { max = sum; }else if(sum < 0) { sum = 0; } } return max; } //思路四 int getMaxSum(int a[],int n) { int sum,max,i; sum = max = a[0]; for(i=1;i<n;i++) { sum = a[i] > (a[i] + sum) ? a[i] : (a[i] + sum); max = sum > max ? sum : max; } return max; }