解法一 动态规划
class Solution {
public int maxSubArray(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int pre = 0;
int ans = nums[0];
for (int num : nums) {
pre = Math.max(pre + num, num);
ans = Math.max(pre, ans);
}
return ans;
}
}
解法二 分治法
class Solution {
public int maxSubArray(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
return maxSubSum(nums, 0, nums.length - 1);
}
private int maxSubSum(int[] nums, int left, int right) {
int ans = 0;
if (left == right)
return nums[left];
int mid = (left + right) / 2;
int maxLeftSum = maxSubSum(nums, left, mid);
int maxRightSum = maxSubSum(nums, mid + 1, right);
int maxLeftBorderSum = nums[mid];
int leftBorderSum = 0;
int maxRightBorderSum = nums[mid];
int rightBorderSum = 0;
for (int i = mid; i >= left; i--) {
leftBorderSum += nums[i];
maxLeftBorderSum = Math.max(leftBorderSum, maxLeftBorderSum);
}
for (int j = mid; j <= right; j++) {
rightBorderSum += nums[j];
maxRightBorderSum = Math.max(rightBorderSum, maxRightBorderSum);
}
int maxMidSum = maxLeftBorderSum + maxRightBorderSum - nums[mid];
ans = getMaxOfThree(maxLeftSum, maxMidSum, maxRightSum);
return ans;
}
private int getMaxOfThree(int a, int b, int c) {
int ans;
if (a > b)
ans = a;
else
ans = b;
if (ans < c)
return c;
return ans;
}
}