九章演算法面試題31 子陣列的最大差

2021-07-02 12:40:06 字數 607 閱讀 3389

給定乙個陣列,求兩個不相交的並且是連續的子陣列a和b(位置連續),滿足|sum(a) - sum(b)|最大(和之差的絕對值)。例如[2, -1, -2, 1, -4, 2, 8],可以得到a=[-1, -2, 1, -4], b=[2, 8],最大差為16。

預處理每個位置往左/右的最大/最小子陣列,然後再列舉劃分位置,求得所有maxleft[i] - minright[i+1]和maxright[i+1] - minleft[i]中的最大值,即為答案。預處理o(n),列舉劃分位置o(n),整體o(n)。

在《九章演算法面試題12 最大子區間/子矩陣》中,我們介紹了在o(n)時間內求得最大子陣列(子區間)的方法,在這個題目中,實際上是通過列舉劃分位置(ab兩個陣列中間的間隔)來將求兩個陣列之差最大的問題變為了求某個陣列最大/最小子陣列的問題。最小子陣列只需要將每個數取相反數則可用最大子陣列的方法來求得。

仔細考慮本題,實際上a陣列和b陣列一定是相鄰陣列,因為假設a和b之間存在一段數字,假設和為c,如果c>0則可以加入a和b中較大的一邊讓差變得更大,如果c<0,則加入較小的一邊也可以讓差變得更大,如果c=0,加入a或者b都不會影響結果。因此,只需要計算每個位置開始往左取到的最大/最小小連續和與往右取到的最大/最小連續和,即可得到答案。

九章演算法面試題33 陣列波峰

乙個陣列a 1.n 假設陣列中沒有任何相鄰兩數相等,滿足a 1 n。a i 被稱為波峰,當且僅當a i a i 1 並且a i a i 1 請找到陣列中的乙個波峰。假設陣列中存在相鄰相等的數,該怎麼做?根據條件a 1 a n 可知a中一定存在波峰。用二分法,選擇中點mid,如果a mid 是波峰,則...

九章演算法面試題87 最小子陣列

www.jiuzhang.com 給定乙個整數陣列,找到乙個具有最小和的子陣列。返回其最小和。這道題和max subarray很類似,我用local 和 global 的dp方式闊以解決這道 那麼我們來看動態規劃的四個要素分別是什麼?state localmin i 表示以當前第i個數最為結尾的最小...

九章演算法 Google面試題 內積

描述 給定長度為n的a陣列,長度為k的b陣列 你可以從a陣列裡取k個數 規則如下 即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除 將取出的ai按取出的順序組成c陣列 求b與c的內積最大值 b與c內積為 i 0k 1bi ci 解釋1 a 1,4,3,2,5 b 1,2,3,4 ...