/**
* Kadane's algorithm
*/
public class Solution {
public int maxSubArray(int[] nums) {
int max_so_far = nums[0];
int max_ending_here = nums[0];
for (int i=1; i<nums.length; i++) {
max_ending_here = Math.max(max_ending_here+nums[i], nums[i]);
max_so_far = Math.max(max_ending_here, max_so_far);
}
return max_so_far;
}
}
/**
* divide and conquer
* a1a2...an
* the maximum sum is located at three places a1...a((1+n)/2-1)), ...a((1+n)/2)..., a((1+n)/2+1)...an
*/
/**
* dynamic programming appraoch
* suppose f(n) is the maximum contiguous subarray ending at index n,
* To calculate the solution for any element at index “i” has two options
* EITHER added to the solution found till “i-1“th index
* OR start a new sum from the index “i”.
* then f(n) = max(f(n-1)+nums[n], nums[n]);
*/
public class Solution {
public int maxSubArray(int[] nums) {
int max;
int len = nums.length;
if (len == 0) return 0;
int[] dp = new int[len];
dp[0] = nums[0];
max = nums[0];
for (int i=1; i<len; i++) {
dp[i] = Math.max(dp[i-1]+nums[i], nums[i]);
if (max < dp[i]) max = dp[i];
}
return max;
}
}
/** * Kadane's algorithm */ public class Solution { public int maxSubArray(int[] nums) { int max_so_far = nums[0]; int max_ending_here = nums[0]; for (int i=1;