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