求子陣列的最大和

2021-06-06 04:03:53 字數 1248 閱讀 3452

題目:輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o(n)。

本題最初為2023年浙江大學計算機系的考研題的最後一道程式設計題,在2023年裡包括google在內的很多知名公司都把本題當作面試題。由於本題在網路中廣為流傳,本題也順利成為2023年程式設計師面試題中經典中的經典。

如果不考慮時間複雜度,我們可以列舉出所有子陣列並求出他們的和。不過非常遺憾的是,由於長度為n的陣列有o(n2)個子陣列;而且求乙個長度為n的陣列的和的時間複雜度為o(n)。因此這種思路的時間是o(n3)。

很容易理解,當我們加上乙個正數時,和會增加;當我們加上乙個負數時,和會減少。如果當前得到的和是個負數,那麼這個和在接下來的累加中應該拋棄並重新清零,不然的話這個負數將會減少接下來的和

#include "stdio.h"

#include "conio.h"

/* 求一維陣列的最大連續子陣列元素之和

入口 : a 要計算的一維整數陣列

出口 : ifrom , ito , imaxsum

分別存放 最大連續子陣列的

起始位置,結束位置(含結束位置),元素之和

如果 ito = -1 表示 原陣列是空陣列

*/

void   findgreatestsumofsubarray(

int * a,

int n ,

int * ifrom, int * ito, int * imaxsum )

else;};

};if ( *ito == -1 )

;int m1, m2,sumgt ;

findgreatestsumofsubarray( &a[0], 14, &m1,&m2, &sumgt);

printf( "%d %d %d ",m1,m2, sumgt) ;

getch();

}

執行結果:

8 13 116

求子陣列最大和

題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。因為是o n 的複雜度,...

求子陣列的最大和

陣列 一 題目 感謝 提供的題目 求子陣列的最大和 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸...

求子陣列的最大和

題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求 時間複雜度為 o n 例 輸入的陣列為 1,2,3,10,4,7,2,5,和最大的子陣列為 3,10,4,7,2,因此輸出為該子陣列的和 18。分析 本題最初...