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
.
解法一:暴力解法
#include<vector>
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max = -99999;
for (vector<int>::iterator i = nums.begin() ; i!=nums.end(); i++) {
int sum = 0;
for (vector<int>::iterator j = i; j != nums.end(); j++) {
sum += *j;
if (sum > max) max = sum;
}
}
return max;
}
};
这种解法属于从开始遍历,时间复杂度为O(n^2),LeetCode上通过了所有的测试用例,但是属于Time Limit Exceeded。
解法二:分治法
#include<vector>
class Solution {
public:
int find_max (int a , int b , int c) {
int max = a;
if (b > a) max = b;
if (c > max) max = c;
return max;
}
int divided_maxSubArray(vector<int>& nums , int left , int right) {
if (left == right) return nums[left];
int mid = (left + right) / 2;
int leftmax = nums[mid];
int leftsum = 0;
for (int i = mid ; i >= left ; i--) {
leftsum += nums[i];
if (leftsum > leftmax) leftmax = leftsum;
}
int rightmax = nums[mid + 1];
int rightsum = 0;
for (int j = mid + 1 ; j<= right ; j++) {
rightsum += nums[j];
if (rightsum > rightmax) rightmax = rightsum;
}
return find_max(leftmax + rightmax , divided_maxSubArray(nums , left , mid) , divided_maxSubArray(nums, mid + 1, right));
}
int maxSubArray(vector<int>& nums) {
return divided_maxSubArray(nums , 0 , nums.size() - 1);
}
};
时间复杂度为O(nlogn)