問題:
給出乙個陣列,找到乙個子陣列(連續的),使得該子陣列的元素和是最大的。
輸入:
給定乙個陣列x[1…n],對於任意一對陣列下標為l,r(l≤r)的非空子陣列,其和記為s(l,s).
輸出:
求出s(l,s)的最最值,記為smax .
將陣列x[1…n]分為x[1…n/2]和x[n/2 +1…n]
遞迴求解子問題
s1∶陣列x[1…n/2]的最大子陣列
s2∶陣列x[n/2+1…n]的最大子陣列
合併子問題,得到smax
s3∶跨中點的最大子陣列
陣列x的最太子陣列之和smax =max
執行效率的瓶頸值在合併方面,也就是s3的求解問題。
s3的求解:
記mid = n/2
s3可分為左右兩部分
left:以x[mid]為結尾的最大子陣列之和
right:以x[mid+1]為開頭的最大子陣列之和
s3 = left + right
left的求解:
從x[mid]向前遍歷求和,並記錄最大值
right的求解:
從x[mid +1]向後遍歷求和,並記錄最大值
s3的時間複雜度:
left時間複雜度:o(mid)
right時間複雜度:o(n - mid)
s3時間複雜度:o(n)
;// 序列
// 求跨越中間的最大子串行
intfindmidsum
(int l,
int mid,
int r)
sum =0;
for(
int i=mid+
1; i<=r; i++
)return leftsum + rightsum;
}// 分治求左右兩端最大的子串行和並將其與跨越中間的子串行的和比較大小,返回最大連續子串行的和
intmaxsubarr
(int l,
int r)
intmain()
分而治之 最大子陣列 1
1.問題描述 最大子陣列 2.思路 參考演算法導論 採用分而治之的策略。假設陣列nums共有n個元素,下標範圍 0 n 1,令過程maxbe nums,beg,end 可以返回nums的下標範圍 beg end的子陣列的最大子陣列和,即nums beg,end 的最大子陣列和,下面對maxbe過程進...
分而治之 最大子列和
2 從中間開始分 if left right int mid left right 2 maxleft mergesort a,left,mid 左邊掃瞄 maxright mergesort a,mid 1,right 右邊掃瞄 利用遞迴的思想對a n 不斷分,分到最小為乙個數,再不斷合併處理 從...
分治策略之最大子陣列問題
問題 乙個整數陣列中的元素有正有負,在該陣列中找出乙個連續子陣列,要求該連續子陣列中各元素的和最大,這個連續子陣列便被稱作最大連續子陣列。比如陣列的最大連續子陣列為,最大連續子陣列的和為5 2 1 2 8。一 暴力解法 include using namespace std class soluti...