面试题描述 |
输入一个整型数组,数组里正负数都可能有,数组中的一个或者连续的多个整数组成一个子数组。 求所有子数组的和的最大值,要求时间复杂度为O(n)
解法一:普通累加算法 |
为了求解数组的最大子序列和问题,我们需要 thisSum(用于保存当前子序列和,并做一下相关的比较) 和 maxSum (用于记录目前为止的最大子序列和)协同完成,
代码如下:
public class ArrayIsNullOrEmptyException extends RuntimeException{
public ArrayIsNullOrEmptyException(){}
public ArrayIsNullOrEmptyException(String mess){
super(mess);
}
}
/**
* @author java6b
* @deprecated 求解数组最大子序列和
*/
public class MaxSubSum {
/**
* 普通累加算法
* @param array
* @return
*/
public static int FindGreatestSumOfSubArray(int[] array) {
if (array == null || array.length == 0) {
throw new ArrayIsNullOrEmptyException("数组不能为空!至少保证有一个元素");
}
int thisSum = array[0];
int maxSum = array[0];
for (int i=1;i<array.length;i++){
if (thisSum < 0) {
thisSum = array[i];
} else {
thisSum += array[i];
}
if (thisSum > maxSum) {
maxSum = thisSum ;
}
}
return maxSum;
}
public static void main(String[] args){
int[] data1 = {-1,-5,-3,-49,5,6,4,9,-60,54,-34,65,3};
int[] data2 = {-10,-5,-3,-49,-60};
int[] data3 = {-1,-5,-3,1,-49,-60,-34,-65,-6};
System.out.println(FindGreatestSumOfSubArray(data1));
System.out.println(FindGreatestSumOfSubArray1(data2));
System.out.println(FindGreatestSumOfSubArray1(data3));
}
}
\qquad
解法二:动态规划 |
赋初值以后,如果从当前数组第二个开始,每次只取当前和数组位置的累加和与当前数组值中最大的那个
最大和数值每次再取自身与当前数组和最大的一个。
最后返回最大和。
/**
* @author java6b
* @deprecated 求解数组最大子序列和
*/
public class MaxSubSum {
/**
* 动态规划
* @param array
* @return
*/
public static int FindGreatestSumOfSubArray1(int[] array) {
if (array == null || array.length == 0) {
throw new ArrayIsNullOrEmptyException("数组不能为空!至少保证有一个元素");
}
int thisSum = array[0];
int maxSum = array[0];
for (int i=1;i<array.length;i++){
thisSum = Math.max(thisSum +array[i],array[i]);
maxSum = Math.max(thisSum ,maxSum);
}
return maxSum;
}
public static void main(String[] args){
int[] data1 = {-1,-5,-3,-49,5,6,4,9,-60,54,-34,65,3};
int[] data2 = {-10,-5,-3,-49,-60};
int[] data3 = {-1,-5,-3,1,-49,-60,-34,-65,-6};
System.out.println(FindGreatestSumOfSubArray(data1));
System.out.println(FindGreatestSumOfSubArray1(data2));
System.out.println(FindGreatestSumOfSubArray1(data3));
}
}