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
.
Subscribe to see which companies asked this question
一、题目描述
给定一个整数数组,求其中的非空子数组(连续的一段数),使得它的和最大。
例如:数组nums=[-2,1,-3,4,-1,2,1,-5,4],其中子数组[4,-1,2,1]的元素相加和最大,最大子数组和为6。
二、解题方法
//分治法,求解最大子数组和
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 0) return 0;
return maxSubArraySum(0, nums.size() - 1, nums);
}
int maxSubArraySum(int left, int right, const vector<int>& nums)
{
if (left == right) return nums[left];
int mid = (left + right) / 2;
int leftMax, rightMax;
int leftBounder = 0, rightBounder = 0, ans = 0;
int leftBounderMax = 0, rightBounderMax = 0;
//分:两个基本等长的前后半段子数组,分别求二者的最大子数组和
leftMax = maxSubArraySum(left, mid, nums);
rightMax = maxSubArraySum(mid + 1, right, nums);
ans = max(leftMax, rightMax);
//合:跨越中心点mid的最大子数组和
leftBounderMax = nums[mid];
for (int i = mid; i >= left; i--)
{
leftBounderMax = max(leftBounderMax, leftBounder += nums[i]);
}
rightBounderMax = nums[mid + 1];
for (int i = mid + 1; i <= right; i++)
{
rightBounderMax = max(rightBounderMax, rightBounder += nums[i]);
}
return max(ans, leftBounderMax + rightBounderMax);
}
};