給定乙個整數陣列nums
,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:
輸入:[-2,1,-3,4,-1,2,1,-5,4],輸出:6解釋:連續子陣列 [4,-1,2,1] 的和最大,為 6暴力:暴力列舉所有可能的連續子陣列,演算法複雜度o(n^3)
演算法1:
1int 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演算法3:分治把大問題拆成小問題,然後逐個解決,最後合併起來。int maxsubseqsum2(int a, intn)2
16}17return
maxsum;
18 }
把陣列一分為二,分別遞迴(即左右兩邊再分成小的左右兩邊)的去解決左右兩邊問題,得到兩邊的最大子列和,還有一種情況跨越邊界的最大子列和,然後想要的結果就是這三個數之間的最大的
那個數。演算法複雜度o(nlogn)
1int 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)。
1int 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)
1int 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 需要...