2017滴滴秋招筆試程式設計題-求連續子陣列的最大和
阿新 • • 發佈:2019-01-28
題目:輸入一個整型陣列,數組裡有正數也有負數,陣列中的一個或者連續多個整陣列成一個子陣列,求所有子陣列的和的最大值,要求時間複雜度為O(n)。
例如:輸入的陣列為{1,-2,3,10,-4,7,2,-5},和最大的子陣列為{3,10,-4,7,2},輸出連續子陣列的最大和是8。思路分析:我們可能會想列出陣列所有的子陣列,並求出他們的和,但是對於一個長度為n的陣列,總共有 n(n+1)/2個子陣列,最快也需要O(n2)的時間。
我們來分析一下上述陣列就能找到解題的思路。
(1).我們定義兩個變數,sum(儲存連續累加的和),max(連續子陣列的最大值),都賦值為陣列的第一個元素。然後從第二個元素開始依次遍歷整個陣列,sum開始為1,加上-2變成-1,小於0,再加上3後和為2,比3本身還小,也就是說從第一個數字開始的子陣列的和會小於從第三個數字開始的子陣列的和,因此不需要考慮第一個數字開始的子陣列,之前的累計也被拋棄。
(2).從數字3開始累加,sum等於數字3,加上10,和為13,加上-4和為9,比13小,我們要把13儲存起來即max = 13,它有可能是最大和,繼續迴圈,加上7後和為16,更新max,加上2後最大和為18,更新max,加上-5後和小於max,max的值不變。迴圈結束,最大和為18。實現程式碼
int FindGreatestSumOfSubArray(vector<int> array) {
if(array.size() == 0)
return -1;
int sum = array[0];
int max = array[0];
for(size_t size = 1; size < array.size();++size)
{
if(sum <= 0)
sum = array [size];
else
sum += array[size];
if(sum > max)
max = sum;
}
return max;