很基础的一维动态规划,复杂度O(n)。
public class Solution { public int maxSubArray(int[] A) { int len = A.length; if (len == 0) return 0; int[] max = new int[len]; max[0] = A[0]; int ans = max[0]; for (int i = 1; i < len; i++) { if (max[i-1] <= 0) { max[i] = A[i]; } else { max[i] = max[i-1] + A[i]; } if (max[i] > ans) ans = max[i]; } return ans; } }
但又要求尝试一下n*log(n)的分治法。这个方法记得《编程珠玑》里有,想去找一下书,却忽然发现枕边的书又找不到了,神奇。其实想想就知道了,n*log(n)就是log(n)的高度*每次n的复杂度么,那么可以分两边,求出左半最大值和右半最大值之后,再计算以左半右端点结尾的最大和和右半段左端点为起点最大和,然后拼起来,再三者取最大值。
参见:http://www.cnblogs.com/cheapcrook/archive/2013/01/27/2878580.html