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 ...