題目:輸入一個整形數組,數組裏有正數也有負數。數組中連續的一個或多個整數組成一個子數組,每一個子數組都有一個和。求全部子數組的和的最大值。要求時間複雜度爲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; }