分而治之 最大子陣列 1

2021-07-23 09:56:46 字數 1411 閱讀 2832

1. 【問題描述】    最大子陣列

2. 【思路】    參考演算法導論

採用分而治之的策略。假設陣列nums共有n個元素,下標範圍 0—n-1,令過程maxbe(nums,beg,end)可以返回nums的下標範圍 beg—end的子陣列的最大子陣列和,即nums[beg,...,end]的最大子陣列和,下面對maxbe過程進行分析:

(1). beg==end  則直接返回nums[beg];

(2). beg!=end   則令mid=beg+(end-beg)/2,將陣列nums[beg,...,end]拆分為兩個子陣列nums_left[beg,...,mid]和nums_right[mid+1,...,end],陣列nums[beg,...,end]的最大子陣列來自以下三種情況中的一種:

2.1 完全來自  nums_left[beg,...,mid];

2.2 完全來自 nums_right[mid+1,...,end];

2.3 由nums_left的尾部一部分和nums_right的頭部一部分組成;

2.1和2.2所示的情形是原問題的規模更小的子問題,可以遞迴呼叫過程maxbe求解。下面說一下2.3所示情形的解決方法。在這種情況下,最大子陣列一定包含原陣列nums的元素nums[mid]和nums[mid+1],從下標mid處往前累加陣列元素,找到此過程中的累加和的最大值,設為sum_left,從陣列下標mid+1往後累加陣列元素,找到此過程中累加和的最大值,設為sum_right,則2.3所示情形的最大子陣列和是sum_left+sum_right。最終的返回值是2.1、2.2和2.3三種情況中的最大值.

下面以乙個小例子分析一下。假設包含三個元素的陣列[-2,2,3],下面按行列出分拆過程:

[-2,2,3]    [-2,2]    [3]     

[-2,2]    [-2]    [2]

3.【**】

class solution 

int mid=beg+(end-beg)/2;

int i=mid-1,left=nums[mid],ls=left;

while(i>=beg)

int j=mid+2,right=nums[mid+1],rs=right;

while(j<=end)

int mid_sum=left+right,left_sum=maxbe(nums,beg,mid),right_sum=maxbe(nums,mid+1,end);

int sum=left_sum>=right_sum?left_sum:right_sum;

return sum>=mid_sum?sum:mid_sum;

}int maxsubarray(vectornums)

return maxbe(nums,0,nums.size()-1);

}};

分而治之 最大子陣列問題

問題 給出乙個陣列,找到乙個子陣列 連續的 使得該子陣列的元素和是最大的。輸入 給定乙個陣列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 遞迴求解子問題 s...

分而治之 最大子列和

2 從中間開始分 if left right int mid left right 2 maxleft mergesort a,left,mid 左邊掃瞄 maxright mergesort a,mid 1,right 右邊掃瞄 利用遞迴的思想對a n 不斷分,分到最小為乙個數,再不斷合併處理 從...

動態規劃之最大子陣列

問題 乙個有n個整數元素的一位陣列 a 0 a 1 a n 1 a n 這個陣列當然有很多子陣列,那麼陣列之和的最大值是什麼呢?public class maxchildarray int sum new int numbers.length sum 0 numbers 0 for int i 1 ...