這個以前寫過,見求陣列的最長子陣列之和的最大值
這裡說一下後面擴充套件題目。
1. 簡述
1) 如果陣列首尾相連,即允許找到一組數字(a[i],···,a[n-1], a[0],···, a[j]),請使其和最大,怎麼辦?
2) 如果題目要求返回最大子陣列的位置,演算法應該如何改變?還能保持o(n)的複雜度麼?
2. 思路
第乙個問題,書上給出了解答,即分為首尾相連和首尾不連兩種情況,對於首尾不連的情況,按照前面的思路就可以了,對於首尾相連的情況,那麼必然包含a[n-1]與a[0],然後從a[0]向後找最大的一段(按照不連的方法),從a[n-1]向前找最大的一段(按照不連的方法),然後得到a[0]-a[j] 與 a[i]-a[n-1],如果j=i,兩段重合,那麼整個陣列就是解答。這裡我要說一下,關於兩段重合的情況,當重合的時候,為什麼說整個陣列就是解答呢?這個點上我有質疑,因為假設陣列為1,2,3,4,-1,4,3,2,1,那麼左邊最大的一段是a[0]-a[n-1],右邊最大的一段還是a[0]-a[n-1]那麼按照書上的說法,此時重合,就是最大子陣列為a[0]-a[n-1],實際上應該是去掉中間的-1的。
針對上面的問題最穩妥的方法應該是每次迴圈移位陣列一次,然後按照首尾不連的方法求最大和,這n長度的陣列,移位就是n種情況,每種情況o(n)的複雜度,一共是o(n^2)的複雜度。
第二個問題,應該很容易,每次更新開始位置和結束位置即可。
3. 參考
程式設計之美,2.14節,求陣列的子陣列之和的最大值
程式設計之美2 14 求陣列的子陣列之和的最大值
問題描述 乙個有n個整數元素的一維陣列 a 0 a 1 a n 1 它包含很多子陣列,求子陣列之和的最大值,當陣列元素全部為負的時候,有兩種處理辦法,第一種是返回0,第二種是返回陣列中最大的負數。解法1 使用暴力法,假設最大的一段陣列為a i a j 則對i 0 n 1 j i n 1,遍歷一遍,求...
程式設計之美2 14 求陣列的子陣列之和的最大值
這是乙個在面試中出現概率很高的一道題目,就拿我來說吧,面試了5家公司中,兩家公司問了這道題目,可見,這道題目是非常經典的。解題思想也不是很難,我熟悉的有 兩種解題辦法 1.一直連加,終止當前序列的條件是連加的和是負數 因為,乙個數加上乙個負數之後肯定是沒有原來的數值大,所以,這肯定是沒有意義的,最終...
程式設計之美2 14 求陣列的子陣列之和的最大值
問題描述 乙個有n個整數元素的一維陣列 a 0 a 1 a 2 a n 1 這個陣列當然有很多子陣列,那麼子陣列之和的最大值是什麼呢?解法 1.暴力解法 o n 3 2.改進版暴力解法 o n 2 3.分治演算法 o nlogn 暫時未去實現 4.陣列間關係法 o n 具體思路和 1.暴力解法 思路...