只有當陣列中包含負數時,最大子陣列問題才有意義。如果所有元素都是非負的,最大子陣列問題沒有任何意義,因為整個陣列和肯定是最大的
1public
class
findmaxsubarraydemo ;
4int result_arr = findmaximumsubarray(arr, 0, arr.length - 1);
5for (int i = 0; i < result_arr.length; i++) 8}
9/*10最大陣列問題:使用分治策略
11分析:1.要將大陣列劃分為兩個規模盡量相等的子陣列,也就是找到大陣列的**位置mid,
122.求解兩個子陣列a[low,mid]和a[mid+1,high]
133,那麼所求的最大陣列a[i,j]就只用三種情況
14* 第一種情況:完全位於a[low,mid],因此low <= i <= j <= mid;
15* 第二種情況:完全位於a[mid+1,high],因此 mid+1 <= i <= j <= high;
16* 第三種情況:跨越了中點,因此low <= i <= mid j <= high;
174.可以遞迴第一種和第二種情況的最大子陣列問題,因為兩個子問題仍然是最大陣列問題,只是規模更小
185.因此,只要尋找跨越中點的最大子陣列
196.最後進行三者比較選取最大值的問題。
20*/
21public
static
int findmaxcrossingsubarray(int arr, int low, int mid, int high) 34}
35 sum = 0;
36for (int i = mid + 1; i <= high; i++) 42}
43 result_arr[0] =max_left;
44 result_arr[1] =max_right;
45 result_arr[2] = left_sum +right_sum;
46return
result_arr;47}
4849
public
static
int findmaximumsubarray(int arr, int low, int
high) else
else
if (right_result_arr[2] >= left_result_arr[2] && right_result_arr[2] >= cross_result_arr[2]) else68}
69}70 }
分治策略之最大子陣列
分治策略是將父問題差分成的多個子問題,然後遞迴的方式解決子問題。整個思想和動態規劃類似,不過分治策略不要求最優解問題,而只是把父問題分解成子問題。步驟 分解 divide 先將問題劃分成子問題。子問題的形式與原問題相同。解決 conquer 遞迴解決問題,當問題縮小到一定程度就能夠直接求解。合併 c...
分治策略之最大子陣列問題
問題 乙個整數陣列中的元素有正有負,在該陣列中找出乙個連續子陣列,要求該連續子陣列中各元素的和最大,這個連續子陣列便被稱作最大連續子陣列。比如陣列的最大連續子陣列為,最大連續子陣列的和為5 2 1 2 8。一 暴力解法 include using namespace std class soluti...
分治策略之最大子陣列問題
最大子陣列,即子陣列中的各個元素相加的和是所有子陣列中最大的。假設最大子陣列為 ai.aj 則必然是以下三種情況 1 完全位於子陣列a low.mid 中 2 完全位於子陣列a mid 1.high 中 3 跨越了中點low i mid j high 如果暴力求解的話,時間複雜度為 n int fi...