AcWing 55 連續子陣列的最大和

2021-09-12 07:56:07 字數 814 閱讀 8388

題目描述:

輸入乙個非空整型陣列,陣列裡的數可能為正,也可能為負。

陣列中乙個或連續的多個整數組成乙個子陣列。

求所有子陣列的和的最大值。

要求時間複雜度為o(n)。

樣例

輸入:[1, -2, 3, 10, -4, 7, 2, -5]

輸出:18

分析:

本題作為動態規劃的經典題,在紫書上高效演算法設計第一節便給出了各種複雜度的解法。

暴力法:列舉部分和起點,終點以及求部分和,需要立方級複雜度。

部分和:直接用字首和來求部分和,省去了求部分和的遍歷,複雜度平方級。

分治法:在字首和基礎上進行分治,可實現nlogn複雜度的演算法。

動態規劃:定義dp[i]為以第i個數為末尾的最大部分和,省去了對起點的列舉,實現線性的時間複雜度。

儘管較早就接觸到這道題,但是在前年的研究生入學考試中,thu的專業課ds中第二道演算法題就出現了這道題,比較悲催的是當時雖然做過此題,考場上卻腦子短路,這題空著了,白白損失了十幾分。正因為如此,至今對這題記憶猶新。

現在再做一遍這題,不用刻意去想怎麼dp。我們知道,對於1 2 -4 2這樣的序列,字首和到了-4這便成了負數,再加上字首的這麼多數得不償失,而對於1 2 -1 2這樣的序列,即使遍歷到了-1,但是總和還是正數,加上字首更有益。

所以我們定義s為以當前遍歷數為最後乙個數的部分和的最大值。在遍歷到下乙個數前,若s為正,則不變,否則對s清零即可。

class solution 

return m;

}};

AcWing 55 連續子陣列的最大和

輸入乙個非空整型陣列,陣列裡的數可能為正,也可能為負。陣列中乙個或連續的多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 樣例輸入 1,2,3,10,4,7,2,5 輸出 18此題o n 的解法是用動態規劃。dp i 是以i結尾的最大子序和,如果dp i 1 小於0,那麼dp...

(7)連續子陣列問題

include using namespace std 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因...

523 連續的子陣列和

解法一 字首和的暴力搜尋 o n 2 我們遍歷每乙個連續的序列,判斷他是否滿足條件,我們使用字首和 這種解法相信不用多說就會的 public boolean checksubarraysum int nums,int k 迴圈處理每一段連續的序列 for int i 0 i nums.length ...