題目:輸入乙個整形陣列,陣列裡有正數也有負數。
陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。
求所有子陣列的和的最大值。要求時間複雜度為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,因此輸...