53. Maximum Subarray
- Total Accepted: 174686
- Total Submissions: 447557
- Difficulty: Easy
- Contributors: Admin
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
解題分析:結合本週所講的divide and conquer算法,先嚐試將該問題分解爲子問題,具體來說就是,所要求的subarray數組,所在的位置有三種可能(設該數組的中間下標元素爲mid),第一種:在下標區間[0,mid];第二種:在下標區間[mid+1,array.size()-1];第三種:在前兩個所述區間之間,這時可知中間元素array[mid]必定在subarray中,此時可以以mid爲起始點分別掃描前面兩個數組找到最大子數組然後相加得到最大數組;
綜上 遞推式爲T(n)=2T(n/2)+O(n),由主定理可知複雜度爲O(nlog);貼上代碼
class Solution {
public:
int maxSubArray(vector<int>& nums) {
return calmaxsubarr(nums, 0, nums.size()-1);
}
private:
int div_con(vector<int>&A, int begin, int end){
if(begin == end) return A[begin];
int mid = (end-begin)/2 + begin;
int left = div_con(A, begin, mid);
int right = div_con(A, mid+1, end);
int lefthalf = A[mid];
int tmp = A[mid];
for(int i = mid -1; i >= begin; i--){
tmp += A[i];
if(tmp > lefthalf) lefthalf = tmp;
}
int righthalf = A[mid+1];
tmp = A[mid+1];
for(int i = mid +2; i <= end; ++i){
tmp += A[i];
if(tmp > righthalf)righthalf = tmp;
}
int middle = lefthalf + righthalf;
int res = left > right ? left : right;
res = res > middle ? res : middle;
return res;
}
};
總結:該題主要難點在於遞歸式子的思考,查看資料得知還可以用複雜度爲O(n)的dp算法解決,待有時間再去研究。