最大子段的平均数

给定 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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值