标签:ret ber ase which cti current 数组 style middle
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.
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
Java Solution 1:
Runtime beats 71.37%
完成日期:03/28/2017
关键词:Array
关键点:基于 Kadane‘s Algorithm 改变
1 public class Solution 2 { 3 public int maxSubArray(int[] nums) 4 { 5 // Solution 1: O(n) 6 // check param validation. 7 if(nums == null || nums.length == 0) 8 return 0; 9 10 int sum = 0; 11 int max = Integer.MIN_VALUE; 12 13 // iterate nums array. 14 for (int i = 0; i < nums.length; i++) 15 { 16 // choose a larger one between current number or (previous sum + current number). 17 sum = Math.max(nums[i], sum + nums[i]); 18 max = Math.max(max, sum); // choose the larger max. 19 } 20 21 return max; 22 } 23 24 25 26 }
Java Solution 2:
Runtime beats 71.37%
完成日期:03/28/2017
关键词:Array
关键点:Kadane‘s Algorithm
1 public class Solution 2 { 3 public int maxSubArray(int[] nums) 4 { 5 int max_ending_here = 0; 6 int max_so_far = Integer.MIN_VALUE; 7 8 for(int i = 0; i < nums.length; i++) 9 { 10 if(max_ending_here < 0) 11 max_ending_here = 0; 12 max_ending_here += nums[i]; 13 max_so_far = Math.max(max_so_far, max_ending_here); 14 } 15 return max_so_far; 16 } 17 18 19 20 }
Java Solution 3:
Runtime beats 29.96%
完成日期:03/29/2017
关键词:Array
关键点:Divide and Conquer
1 public class Solution 2 { 3 public int maxSubArray(int[] nums) 4 { 5 // Solution 3: Divide and Conquer. O(nlogn) 6 if(nums == null || nums.length == 0) 7 return 0; 8 9 10 return Max_Subarray_Sum(nums, 0, nums.length-1); 11 } 12 13 public int Max_Subarray_Sum(int[] nums, int left, int right) 14 { 15 if(left == right) // base case: meaning there is only one element. 16 return nums[left]; 17 18 int middle = (left + right) / 2; // calculate the middle one. 19 20 // recursively call Max_Subarray_Sum to go down to base case. 21 int left_mss = Max_Subarray_Sum(nums, left, middle); 22 int right_mss = Max_Subarray_Sum(nums, middle+1, right); 23 24 // set up leftSum, rightSum and sum. 25 int leftSum = Integer.MIN_VALUE; 26 int rightSum = Integer.MIN_VALUE; 27 int sum = 0; 28 29 // calculate the maximum subarray sum for right half part. 30 for(int i=middle+1; i<= right; i++) 31 { 32 sum += nums[i]; 33 rightSum = Integer.max(rightSum, sum); 34 } 35 36 sum = 0; // reset the sum to 0. 37 38 // calculate the maximum subarray sum for left half part. 39 for(int i=middle; i>= left; i--) 40 { 41 sum += nums[i]; 42 leftSum = Integer.max(leftSum, sum); 43 } 44 45 // choose the max between left and right from down level. 46 int res = Integer.max(left_mss, right_mss); 47 // choose the max between res and middle range. 48 49 return Integer.max(res, leftSum + rightSum); 50 51 } 52 53 }
参考资料:
http://www.cnblogs.com/springfor/p/3877058.html
https://www.youtube.com/watch?v=ohHWQf1HDfU
LeetCode 算法题目列表 - LeetCode Algorithms Questions List
LeetCode 53. Maximum Subarray(最大的子数组)
标签:ret ber ase which cti current 数组 style middle
原文地址:http://www.cnblogs.com/jimmycheng/p/7204034.html