最近很慌自己演算法這一塊,想著去領扣上練一下,然後遇到了一道最大連續子陣列的問題,感覺似曾相識,就是想不起來怎麼做。雖說可以用暴力法來解,但是那樣的話就沒有什麼練習的必要了。
題目大致如下:
給定乙個陣列,求它的最大連續子陣列,這裡的最大指的是子陣列之和最大,陣列中可能有正數、負數或者0。
因為之前接觸過一點動態規劃,上網找了一下這種題的動規解法,開始總覺得思維有點繞不過來,直到仔細閱讀找到的資料,發現問題出在了沒有好好閱讀人家設定的思維。
動規解法的思維是假設某個元素為最大子陣列的最後一位,也就是說,這個元素要麼和它前乙個元素連在一起,可能還有其他元素共同組成子陣列,要麼自己組成子陣列。
仔細想一下,設定的這種思維並不違背最終結果,因為最終結果至少要包含乙個元素,而最終子陣列的最後一位一定來自於給定陣列。
首先來考慮一下比較簡單也比較極端的一種情況,如果陣列中只有乙個元素:
這種情況下,最大連續子陣列就是這個元素本身。但如果按照前面設定的思維來思考,應該是這樣的,假設array[0]為最大子陣列的最後一位,那麼這個子陣列要麼是它自己,要麼是它與它前乙個元素連在一起,可能還有其他元素共同組成子陣列。但是,它的前面並沒有元素,所以只能是它自身。也就是說,這個結果就是兩種可能性中的最優解,就是所謂的區域性最優解。
那麼如果陣列的末位再加入乙個元素呢?
設定array[1]為最大子陣列的最後一位(實際上不一定是),那麼這個子陣列要麼是它自己,要麼是它與它前乙個元素連在一起,可能還有其他元素共同組成子陣列。
有且只有這兩種情況,因為題目規定子陣列必須連續。
它的前乙個元素為array[0],也就是陣列中第乙個元素。
那麼現在針對設定array[1]為最大子陣列的最後一位的情況,可以求出兩個結果,結果一為array[1]自身,結果二為array[1]與array[0]以及可能還有(假設可能)array[0]前面的元素組成。
那麼又可以得出兩個結果,結果一為array[1]自身,結果二為array[1]加前一次計算的區域性最優解,因為加前一次的區域性最優解就滿足了,array[1]與它的前一位連續的這個條件。
當然這只是原因之一,另外乙個主要的原因就是,前一次計算的區域性最優解還可以有另乙個定義,與當前元素連續的最大子陣列之和。
找了幾個網上的解法,是將每一次的區域性最優解都記錄下來,最後一起比較。
但是實際上只需要記錄兩個值,最大區域性最優解(最終結果),前一次區域性最優解(用於本次計算)。
然後我稍微自己改造了一下:
staticint maxsubarray(int
nums) ;
for (int i = 1; i < nums.length; i++)
return arr[0];
}
最後,感覺這個思路挺繞的... ...
動態規劃之最大子陣列
問題 乙個有n個整數元素的一位陣列 a 0 a 1 a n 1 a n 這個陣列當然有很多子陣列,那麼陣列之和的最大值是什麼呢?public class maxchildarray int sum new int numbers.length sum 0 numbers 0 for int i 1 ...
動態規劃之最大子矩陣和
分析 我們已經解決了一維的問題 基礎篇中的最大子段和問題 現在變成二維了,我們看看能不能把這個問題轉化為一維的問題。最後子矩陣一定是在某兩行之間的。假設我們認為子矩陣在第i行和第j列之間,我們如何得到i和j呢,對,列舉。列舉所有1 i j m,表示最終子矩陣選取的行範圍。我們把每一列第i行到第j行之...
動態規劃 最大子陣列
解題思路 對於這樣乙個連續和的問題 個人習慣叫做最大連續和 如果我們要用動態規劃來解,首先得考慮狀態和狀態轉移方程。如果我們把題述陣列看成序列,那麼是不是可以用序列dp來考慮呢?我們不妨考慮乙個這樣的序列 1,3,5,2,4 a i 表示這個序列的第 i 個元素,dp i 表示最後乙個元素是a i ...