關於連續子陣列的最大和和最大積

2021-08-27 20:16:56 字數 1596 閱讀 4058

find the contiguous subarray within an array (containing at least one number) which has the largest sum.

for example, given the array [−2,1,−3,4,−1,2,1,−5,4],

the contiguous subarray [4,−1,2,1] has the largest sum = 6.

這道題目,我沒有做出來,想錯了,以為求a[i] 的 max和,就是求出a[i-1] ,然後再拿a[i]比較,就是了,但是

這樣的話,對於陣列,比如 ,那麼max(4) = 8 , max(5) = 20 , 但是還有更大的子串 不能得到,因為我是前乙個的最大子串來計算的。

這樣不可以的。 

參考了discuss中的方法,通過引入臨時和sum,

基本思想就是:如果當前和為負數,後面的數值加上當前和則必然小於原數值,則應將當前和丟棄。

注意這裡考慮的是當前和是否為負而不是當前值!

只要你不小於0,那麼對於以後求和,都是增加的!同樣,不要擔心與負數相加,會減少我們的最大值,

因為最大值,是存在result中,最後是要與他比較來確定最大值。

寫到這裡,我覺得我有點明白這個題目的子問題在**了,sum(n - 1) 就是他的子問題。

通過sum(n-1) ,我們可以求得sum(n) , 然後sum(n) 與 result比較,得到result.

遞推公式:  

sum = max(sum + a[i], a[i]);

global[i + 1] = max(sum, global[i]);

public int maxsubarray(int a) 

return result;

}}

最大積問題:

思路 : 同樣子問題也是sum(n-1) , 但是這次不同,因為存在負數與負數相乘 , 比如;

解決的辦法,維持乙個maxsum, 和 minsum , 因為前n-1個元素中,存在乙個負數的話,那麼最小值必然就是它與其他值的乘積。

然後求max 的時候,就拿這個minsum * arr[n] 與 maxsum*arr[n] ,arr[n] 比較,取的最大值,再與result比較。

通過維持乙個最大陣列記錄i 位置時的最大值,維持乙個最小資料記錄i 位置的最小值!

這樣的話,當arr[i]為負時,我就能通過檢測最小值與它相乘看是否大於之前的最大值,這就解決了負負相乘可能大於max的問題

遞推式:

// i 位置最大值的拷貝

max_copy[i] = max_local[i]

//第乙個max取得最大值與a[i]相乘結果與a[i]比較,然後再拿最小值與a[i]相乘

max_local[i + 1] = max(max(max_local[i] * a[i], a[i]), min_local * a[i])

min_local[i + 1] = min(min(max_copy[i] * a[i], a[i]), min_local * a[i])

牛客網 關於連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...

最大和連續子陣列

問題描述 乙個數值型陣列,其子陣列有多個,求其子陣列中最大的和值。所謂和值,是指數組所有元素相加的和。解法 1 掃瞄法,維護max變數,儲存最大和,其初始值為data 0 假設最大和子陣列的第一位下標為i,i從0到n 1,對於每個i值,從data i 開始,進行累加,每加乙個數,與max變數比較一次...

連續子陣列最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...