方法1: greedy + recursion。这是我在discussion区域找到的一个比较好的办法。时间复杂m,m为input数组长度,空间复杂1。
class Solution {
int largestSum = Integer.MIN_VALUE;
public int maxSubArray(int[] nums) {
if(nums.length == 1)
return nums[0];
if(nums.length == 0)
return 0;
recMaxSubArray(nums, 0, 0);
return largestSum;
}
public void recMaxSubArray(int[] nums, int start, int currentSum){
if(start == nums.length){
return;
}
/*if currentSum + nextNumber is less than nextNumber
it means we need to start fresh from the nextNumber */
while(start < nums.length && nums[start] + currentSum >= nums[start]){
currentSum += nums[start];
if(currentSum > largestSum){
largestSum = currentSum;
}
++start;
}
recMaxSubArray(nums, start, 0);
}
}
方法2: dp。时间复杂m,空间复杂m。这是我自己想的一个dp做法,我觉得还是不错的,但是好像没有看到有人有这种做法,我已经post到discussion板块里去了。下面是我的post的链接。
class Solution {
public int maxSubArray(int[] nums) {
int len = nums.length;
if(len == 1) return nums[0];
int[][] dp = new int[2][len];
dp[0][0] = Integer.MIN_VALUE;
dp[1][0] = nums[0];
for(int i = 1; i < len; i++){
dp[0][i] = Math.max(dp[0][i - 1], dp[1][i - 1]);
dp[1][i] = Math.max(nums[i], nums[i] + dp[1][i - 1]);
}
return dp[0][len - 1] > dp[1][len - 1] ? dp[0][len - 1] : dp[1][len - 1];
}
}
总结:
- 这道题还有分治法,参考lc官方解答1.