原题链接在这里:https://leetcode.com/problems/maximum-subarray/
本题借鉴了这篇帖子:http://blog.youkuaiyun.com/linhuanmars/article/details/21314059
采用的是DP解法,同时维护局部最优和全局最优,局部最优就是必须包含当前点的最优解,全局最优可以不包含当前点。
历史信息就是local[i-1] 和 global[i-1], 跟新当前信息时先更新局部最优,
local[i] = Math.max(local[i-1]+nums[i], nums[i]), 有可能local[i-1]是负数,就直接取nums[i],然后更新全局最优,
global[i] = Math.max(lcoal[i], global[i-1]), 要么是原来的全局最优,要么是局部最优,此时能涵盖所有解。若果全局最优不包含当前值,那么会被维护在global[i-1]中,若包含当前值,那么就是local[i].
扫了一遍数组,Time O(n), 只需要local[i-1] 和global[i-1]两个值就可以更新当前解,所以不需要两个数组。两个数即可,SpaceO(1).
AC Java:
public class Solution {
public int maxSubArray(int[] nums) {
if(nums == null || nums.length ==0){
return 0;
}
int global = nums[0];
int local = nums[0];
for(int i = 1; i< nums.length; i++){
local = Math.max(local + nums[i], nums[i]);
global = Math.max(global, local);
}
return global;
}
}
与Maximum Product Subarray相似。