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
.
click to show more practice.
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); } };