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); } }
原文:https://www.cnblogs.com/zhacai/p/10429247.html