Leetcode 53. Maximum Subarray
解法1. 使用dp, O(n)
解法2. 使用divide and conquer
对于每一个子数组都分成L,R两部分,分别寻找L,R中最大的子序列
a. L中的最大
b. R中的最大
c. 横穿L,R的最大(与平面中的点同理)
T(n) = 2T(n/2) + n
T(n) = O(nlogn)
class Solution {
private int find_R(int []num, int left, int right) {
int n = num[left];
int max = n;
for(int i = left+1; i <= right; i ++) {
n+=num[i];
if(n > max) max = n;
}
return max;
}
private int find_L(int []num, int left, int right) {
int n = num[right];
int max = n;
for(int i = right-1; i >= left; i --) {
n+=num[i];
if(n > max) max = n;
}
return max;
}
private int divide(int []nums, int left, int right) {
// Base Case
if(left == right) return nums[left];
// Recursive Case
int mid = (left + right) /2 ;
int n = divide(nums, left, mid);// left T(n/2)
n=(n > divide(nums, mid+1, right))?n:divide(nums, mid+1, right);// right T(n/2)
int m = find_L(nums, left, mid) + find_R(nums, mid+1, right);
n = Math.max(n, m);
return n;
}
public int maxSubArray(int[] nums) {
return divide(nums, 0, nums.length-1);
}
}