很基础的一维动态规划,复杂度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