題目
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.
解題之法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = INT_MIN, curSum = 0;
for (int num : nums) {
curSum = max(curSum + num, num);
res = max(res, curSum);
}
return res;
}
};
分析
這道題讓我們求最大子數組之和,并且要我們用兩種方法來解。
首先是O(n)的解法,定義兩個變量res和curSum,其中res保存最終要返回的結果,即最大的子數組之和,curSum初始值為0,每遍歷一個數字num,比較curSum + num和num中的較大值存入curSum,然后再把res和curSum中的較大值存入res,以此類推直到遍歷完整個數組,可得到最大子數組的值存在res中。
然后是分治法Divide and Conquer Approach,這個解法的時間復雜度是O(nlgn),類似于二分搜索法,我們需要把數組一分為二,分別找出左邊和右邊的最大子數組之和,然后還要從中間開始向左右分別掃描,求出的最大值分別和左右兩邊得出的最大值相比較取最大的那一個。