劍指offer 31 連續子陣列的最大和

2021-10-07 02:50:50 字數 2164 閱讀 5782

輸入乙個整型陣列,陣列裡有正數也有負數。

陣列中乙個或連續的多個整數組成乙個子陣列,求所有子陣列和的最大值,

要求時間複雜度o(n)。

看到這個問題的時候我首先想到是:例項化乙個新陣列,用陣列元素作為下標,元素出現的個數作為陣列值,但是想想又發現不行;因為陣列裡的值不確定,因此例項化陣列的時候陣列大小就不確定,所以不能用這種方法。

接下來看一下解題思路:

思路一:

舉例分析陣列的規律:

假設陣列為

從頭到尾累加陣列,第一步加上第乙個數字 1 和為 1 ,第二步加上數字 -2,和為 -1 ,注意:由於之前累計的和為 -1,小於0,那麼之後和3加為 2 小於 3本身。也就是說從第乙個開始的字陣列累加的和會小於從 3 開始的累加的和。因此之前的和就可以捨棄。

從三個數字重新開始累加,得到的和為 3, 第四步加 10,得到13,第五步加上 -4和為 9,有與 -4 是負數,因此累加之後的和比之前小,所以需要乙個變數把之前的和儲存起來,因為有可能這個和就是最後的最大值。

**示例:

public

intfindgreatestsumofsubarray

(int

array)

//記錄當前累加的和

int record =0;

//用來儲存最大值,賦值為0x80000000,可能陣列都為負數

int max = integer.min_value;

for(

int i =

0; i < array.length; i++

)else

if(record > max)

}return max;

}

總結

這裡需要注意的是

這裡判斷無效輸入返回值也是0;

若是需要判斷是無效輸入還是子陣列的最大和就是0,可以增加乙個boolean型別的變數來標記是否是無效輸入。

思路二使用動態規劃實現:

f(i):以array[i]為末尾元素的子陣列的和的最大值,子陣列的元素的相對位置不變

f(i)=max(f(i-1)+ array[i] , array[i])

record:所有子陣列的和的最大值

record=max(record,f(i))

如陣列[6, -3, -2, 7, -15, 1, 2, 2]

初始狀態:

f(0)= 6

record = 6

i=1:

f(1)=max(f(0) - 3,-3)= max(6 - 3,3)= 3

record= max(f(1),record)= max(3,6)= 6

i=2:

f(2)= max(f(1)- 2,-2)= max(3 - 2,-2)= 1

record= max(f(2),record)= max(1,6)= 6

i=3:

f(3)= max(f(2)+ 7,7)= max(1+7,7)= 8

record= max(f(2),record)= max(8,6)= 8

i=4:

f(4)= max(f(3)-15,-15)= max(8-15,-15)= -7

record=max(f(4),record)= max(-7,8)= 8

以此類推

最終record的值為8

**示例:

public

intfindgreatestsumofsubarray

(int

array)

//記錄當前所有子陣列和的最大值

int record = array[0]

;//包含array[i]的連續陣列最大值

int max = array[0]

;for

(int i =

1; i < array.length; i++

)return record;

}

劍指Offer 程式設計題31(連續子陣列的最大和)

例如輸入的陣列為,和最大的子陣列為 3,10,4,7,2 因此輸出為該子陣列的和18 解法一 舉例分析陣列的規律。我們試著從頭到尾逐個累加示例陣列中的每個數字。初始化和為0。第一步加上第乙個數字1,此時和為1。接下來第二步加上數字 2,和就變成了 1。第三步刷上數字3。我們注意到由於此前累計的和是 ...

劍指Offer 面試題31 連續子陣列的最大和

連續子陣列的最大和 輸入乙個整形陣列,陣列裡有整數也有負數。陣列中乙個或連續的多個整數組成乙個子陣列。求所有子陣列的和的 最大值。要求時間複雜度為o n 分析 剛開始令sum 0,f i else if lsum lmaxsum printf lld d d n lmaxsum,ibegindex,...

劍指Offer之面試題31 連續子陣列的最大和

所有 均通過g 編譯器 測試,僅為練手紀錄。面試題31 連續子陣列的最大和 題目 輸入乙個整型陣列,陣列裡面有正數也有負數。陣列中乙個或連續的多個整數組成乙個字陣列。求所有子陣列的和的最大值。要求時間複雜度為 o n 面試題31 連續子陣列的最大和 題目 輸入乙個整型陣列,陣列裡面有正數也有負數。陣...