问题
给定一个数组,求一个子数组,这个子数组的和是所有子数组中最大的。
习题4.1-5给出了一个线性内求出结果的思路,但是看到网上有不少文章按照该思路写出的其实不是线性时间,而是平方时间。
线性时间解法
private static void linear(int[] arr){
int low = 0;
int high = 0;
int sum = Integer.MIN_VALUE;
int maxSum = 0;
int leftIndex = 0;
int time = 0;
for(int i = 0;i<arr.length;i++,time++){
maxSum+=arr[i];
if(maxSum > sum){
sum = maxSum;
low = leftIndex;
high = i;
}
if(maxSum < 0){
maxSum = 0;
leftIndex = i+1;
}
}
System.out.println(low + " "+ high + " "+sum);
System.out.println(time);
}
平方时间解法
private static void square(int[] arr){
int low = 0;
int high = 0;
int maxSum = arr[0];
int time = 0;
for(int i=0;i<arr.length - 1;i++,time++){
int sum = 0;
for(int j=i+1;j>=0;j--,time++){
sum+=arr[j];
if(sum > maxSum){
high = i+1;
low = j;
maxSum = sum;
}
}
}
System.out.println(low + " " +high+" "+maxSum);
System.out.println(time);
}