Given an integer array nums
, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.
Follow up:If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
public int maxSubArray(int[] nums) {//动规 my
int re =nums[0];
int curr = nums[0];
for (int i = 1; i < nums.length; i++) {
curr = curr<0?nums[i]:(nums[i]+curr);
re = curr>re?curr:re;
}
return re;
}
分治
public class Solution
{
public int maxSubArray(int[] nums)
{
// Solution 3: Divide and Conquer. O(nlogn)
if(nums == null || nums.length == 0)
return 0;
return Max_Subarray_Sum(nums, 0, nums.length-1);
}
public int Max_Subarray_Sum(int[] nums, int left, int right)
{
if(left == right) // base case: meaning there is only one element.
return nums[left];
int middle = (left + right) / 2; // calculate the middle one.
// recursively call Max_Subarray_Sum to go down to base case.
int left_mss = Max_Subarray_Sum(nums, left, middle);
int right_mss = Max_Subarray_Sum(nums, middle+1, right);
// set up leftSum, rightSum and sum.
int leftSum = Integer.MIN_VALUE;
int rightSum = Integer.MIN_VALUE;
int sum = 0;
// calculate the maximum subarray sum for right half part.
for(int i=middle+1; i<= right; i++)
{
sum += nums[i];
rightSum = Integer.max(rightSum, sum);
}
sum = 0; // reset the sum to 0.
// calculate the maximum subarray sum for left half part.
for(int i=middle; i>= left; i--)
{
sum += nums[i];
leftSum = Integer.max(leftSum, sum);
}
// choose the max between left and right from down level.
int res = Integer.max(left_mss, right_mss);
// choose the max between res and middle range.
return Integer.max(res, leftSum + rightSum);
}
}