题目描述:
一个有N个元素的数组,这N个元素可以是正数也可以是负数,数组中连续的一个或多个元素可以组成一个连续的子数组,一个数组可能有多个这种连续的子数组,求子数组和的最大值
实现思路:
1.蛮力法:
找到所有的子数组,然后求出子数组的和,取所有子数组和中的最大值。时间复杂度为O(n^3)。分析发现,许多子数组都重复计算了。
代码:
/**方法一:
* 进行了3次循环,第三次的循环主要是将i到j-1之间的数加起来sum,然后与max比较
* O(n^3),很多子数组都重复计算了
*/
private int maxSubArray1(int[] a) {
int sum=0,maxsum=0;
for(int i=0; i<a.length; i++){
for(int j=i; j<a.length; j++){
sum=0;
for(int k=i; k<j; k++){
sum += a[k];
}//
if(sum > maxsum){
maxsum = sum;
}//
}//
}//
return maxsum;
}
2.重复利用已经计算的子数组和:
sum[i,j] = sum[i, j-1] + a[j], 时间复杂度为O(n^2)
/**
* 方法二:
* 重复利用已经计算的子数组和,O(n*2)
*/
private int maxSubArray2(int[] a) {