给定 n 个整数的数组,找出最大的子段,并输出该子段平均数。
示例 1:
输入: [-1,12,-5,-6,50,3],
输出: 最大的和是54.0
子段的开始位置:1 子段的结束位置:5
最大子段平均数为:10.8
解释: 最大平均数 (12-5-6+50+3)/(5-1+1) = 10.8
代码片
.
public class Main {
static int firstIndex = 0;//子段的开始位置
static int lastIndex = firstIndex;//子段的结束位置
public static void main(String[] args) {
int arr[] = new int[] { -1,12,-5,-6,50,3};
int k;//子段的个数
k=lastIndex - firstIndex + 1;
double result = maxSubArray(arr);
System.out.println("子段的开始位置:" + firstIndex + " " + "子段的结束位置:" + lastIndex);
System.out.println("最大子段平均数为:" + result);
}
//求最大字段平均数
public static double maxSubArray(int[] arr) {
double currentSum = arr[0];
double finalSum = arr[0];
for (int i = 1; i < arr.length; i++) {
if (currentSum <= 0) {//如果当前的子段和小于等于零(currentSum<=0),那么arr[i]必定小大于当前字段(currentSum)与arr[i]之和
currentSum = arr[i];//所以将arr[i]赋值给currentSum
if (currentSum > finalSum) {//如果当前字段(currentSum)大于最大字段(finalSum)
finalSum = currentSum;//那么替换最大字段
firstIndex = i;//这时的i就是字段的开始位置
}
} else {//如果当前字段(currentSum)和大于零,那么就加上arr[i],然后与之前最大的字段(finalSum)比较
currentSum += arr[i];
if (currentSum > finalSum) {//如果加上arr[i]后的当前字段(currentSum)大于最大字段(finalSum)
finalSum = currentSum;//那么替换最大字段的值
lastIndex = i;//记录这个最大字段的结束为位置
}
}
}
System.out.println("最大的和是" + finalSum);
return finalSum / (lastIndex - firstIndex + 1);
}
}