暴力 分治 貪心 DP 最大子串行和

2022-01-15 12:41:25 字數 2489 閱讀 5386

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

示例:

輸入:[-2,1,-3,4,-1,2,1,-5,4],輸出:6解釋:連續子陣列 [4,-1,2,1] 的和最大,為 6

暴力:暴力列舉所有可能的連續子陣列,演算法複雜度o(n^3)

演算法1:

1

int maxsubseqsum1(int a, intn)2

15if(thissum >maxsum)

16 maxsum = thissum; //

更新17}18

}19return

maxsum;

20 }

每次從i加到j,我們都必須要經歷k迴圈,i+(i+1)...j,所以每次j迴圈後都要經歷乙個k迴圈從i加到j,想想完全沒有必要,可以直接在前乙個子序

列的基礎上加乙個元素,

所以k迴圈是沒有必要的。

因此優化演算法在相同的i不同的j只需要在j-1次的迴圈的基礎上累加一項即可,演算法複雜度更新為o(n^2)

演算法2:

1

int maxsubseqsum2(int a, intn)2

16}17return

maxsum;

18 }

演算法3:分治把大問題拆成小問題,然後逐個解決,最後合併起來。

把陣列一分為二,分別遞迴(即左右兩邊再分成小的左右兩邊)的去解決左右兩邊問題,得到兩邊的最大子列和,還有一種情況跨越邊界的最大子列和,然後想要的結果就是這三個數之間的最大的

那個數。演算法複雜度o(nlogn)

1

int max3( int a, int b, int

c )2 56

int divideandconquer( int list, int left, int

right )

7 18

19/*

下面是"分"的過程

*/20 center = ( left + right ) / 2; /*

找到中分點

*/21

/*遞迴求得兩邊子列的最大和

*/22 maxleftsum =divideandconquer( list, left, center );

23 maxrightsum = divideandconquer( list, center+1

, right );

2425

/*下面求跨分界線的最大子列和

*/26 maxleftbordersum = 0; leftbordersum = 0;27

for( i=center; i>=left; i-- ) /*

左邊掃瞄結束

*/32

33 maxrightbordersum = 0; rightbordersum = 0;34

for( i=center+1; i<=right; i++ ) /*

右邊掃瞄結束

*/39

40/*

下面返回"治"的結果

*/41

return max3( maxleftsum, maxrightsum, maxleftbordersum +maxrightbordersum );42}

4344

int maxsubseqsum3( int list, int

n )45

每輸入乙個資料,進行即時處理,在任何乙個地方停止輸入,演算法都能得到正確的解,即總是做出在當前看來最好的選擇。

只需遍歷一遍陣列,演算法複雜度為o(n)。

1

int maxsubseqsum4(int a, intn)2

15return

maxsum;

16 }

演算法5:動態規劃(dp)

不斷更新dp[i]中的值,表示a陣列中以a[i]為結尾的最大子串行和,例如a = [2,3,-6,2,4],則dp = [2,5,-1,2,6],則dp陣列中的最大值就是最大子串行和就是6.

只需要遍歷一遍陣列,演算法複雜度o(n)

1

int maxsubseqsum1(int a, intn)2

13else

1417}18

19return

max.dp[i];

20 }

dp是根據自己的理解寫的,如有不對,請指正謝謝。

最大子序和 DP,分治

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。以a 0 結尾的...

最大子串行和(分治求法)

這已經是一道家喻戶曉的題了,給出乙個陣列,裡面是一串數字,求出子串行中和最大的,輸出這個和。思路 這道題有很多經典解法,其中最典型應該是動態規劃,而我們今天要討論的是用二分法怎麼求解這道題。include using namespace std int aleng int f int a,int b...

力扣 53 最大子序和 貪心 暴力

c 刷題學習筆記目錄 c 百萬併發網路通訊 筆記目錄 貪心 最直觀的就是暴力解法,兩層巢狀for迴圈,類似滑動視窗一樣,計算視窗內的序列之和 第一層迴圈 改變視窗移動位置 第二層迴圈 改變視窗尾端位置,不斷擴大直至尾端對齊陣列尾部 class solution 01 return maxsum 需要...