子数组最大平均数

193 阅读1分钟

题目

滑动窗口

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {

        Main main = new Main();
        int [] nums = new int[]{-1};
        main.findMaxAverage(nums, 1);
    }

    public double findMaxAverage(int[] nums, int k) {

        // 滑动窗口, 每次滑动根据移除和添加的元素 重新计算窗口平均值
        int left = 0;
        int right = left + k;
        double max = -Double.MAX_VALUE;
        double preAvg = 0;
        while (right <= nums.length) {
            if (left == 0) {
                preAvg = Arrays.stream(Arrays.copyOfRange(nums, left, right)).average().orElse(Double.NaN);
            } else {
                preAvg = preAvg  + (((double) nums[right - 1] - (double) nums[left - 1]) / k);
            }
            max = Math.max(preAvg, max);
            left ++;
            right ++;
        }
        return max;

    }
}

基本思路

  1. 注意在计算java除法的时候, 一定要将每个数都转成double计算

  2. 注意Double.MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324 是一个非负数值, 而不是想象当中的double的最小值-2^63次

如果想表示负数的最小值应该用-Double.MAX_VALUE.

注意Integer.MIN_VALUE就是负数-2147483648 关于Java double取值范围及Double的MAX_VALUE和MIN_VALUE的总结