求子陣列的最大和

2021-06-25 12:30:13 字數 1397 閱讀 7146

題目:輸入乙個整形陣列,陣列裡有正數也有負數。

陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。

求所有子陣列的和的最大值。要求時間複雜度為o(n)。

例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2,因此輸出為該子陣列的和18。

解析:從下標0開始,如果和為正,就一直加下去;否則,捨棄前面的,往後遍歷重新加和。

延伸:如果沒有要求說「陣列裡有正數也有負數」呢?

對於全為負數  -4 -2 -3 -5 -7 -4,最大子陣列是-4。我們需要重新找兩者相同的規律。我們將第乙個數等於最大子陣列之和max,計算最大子陣列之和為sum,初始為0,遍歷到乙個元素時,如果此時sum為負數或0,把次元素的值賦給sum,繼續往後遍歷;如果sum為正,則累加。在這個過程中,沒遍歷乙個元素,我們都通過比較儲存最大的sum值。文字難以理解?

上圖:

對於第乙個全為負數,起初max=-4,sum=0;第乙個元素-4時,sum=-4;到-2時,sum<0,sum=-2,比較得max=-2;之後沒有值大於-2。

對於第二個陣列,起初max=1,sum=0;第乙個元素時,sum=1;到-2時,sum>0,sum加上-2後sum=-1,max=1;到第三個元素時,sum<0,sum=3,max=3;

之後一直累加(1, -2, 3, 10, -4, 7, 2, -5),到2之後,sum=18,max=18;最後乙個-5時,sum=13,max-18;結束。

上程式:

template

t printmaxchildarray(t array, size_t size)

t sum = 0;

t max = array[0];

for(size_t index = 1; index < size; ++index)

else

if (max < sum)

}return max;}

延伸:如果要具體最大子陣列呢?

那麼我們就要再程式中記錄最大子陣列的起末位置。

上程式:

size_t s_pos = 0;//起始位置

size_t e_pos = 0;//結束位置

template

t printmaxchildarray(t array, size_t size)

t sum = 0;

t max = array[0];

for(size_t index = 1; index < size; ++index)

else

if (max < sum)

}return max;

}

求子陣列最大和

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

求子陣列的最大和

題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 本題最初為2005年浙江大學計算機系的考研題的最後一道程式設計題,在2006年裡包括google在內的很多知名公司都把本題當作面試題。由於本...

求子陣列的最大和

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