【问题标题】:findMaxAverage with big array failing test casesfindMaxAverage 与大数组失败的测试用例
【发布时间】:2019-10-03 03:04:12
【问题描述】:

Q:给定n个整数,找到一个平均数最大且长度为k的连续子数组,并输出最大平均数。

输入:[1,12,-5,-6,50,3],k = 4
输出:12.75
例如:maxAvr (12-5-6+50)/4 = 51/4 = 12.75


class Solution {
    public double findMaxAverage(int[] nums, int k) {
        double[] f = new double[nums.length];//save the max value f[i] with range k from nums[]
        int length = nums.length;
        int sum = 0;
        for (int i = 0; i < k; i++) {
            sum += nums[i];
        }
        if (length == k) {
            return ((double) sum /  k);
        }
        f[k - 1] = (double)sum; // start at f[k-1]
        for (int i = k - 1; i < length - 1; i++) {
            f[i + 1] = f[i] - nums[i - k + 1] + nums[i + 1]; // with dp to find the maxValue in the range k 
        }
        Arrays.sort(f);
        return (double) f[length - 1] / (double) k;
    }
}

调试

  • ✘ 答案错误
  • ✘ 测试用例:一个大数组,有 6514 个项目
  • ✘ 通过了 118/123 个案例(不适用)
  • ✘ 答案:
  • ✘ 标准输出:'0.0'

调试的时候发现idea.sh解决不了大数组

【问题讨论】:

  • 如果你能解释一下你的算法试图做什么,那将会很有用,那么也许你会明白为什么它可能效率低?
  • 感谢@cricket_007,我会学习使用堆栈溢出
  • 如果您对数组进行排序,您的解决方案不是线性时间...您不能只扫描数组以获得最大值吗? (这是我看到你排序的唯一原因)
  • 你甚至不需要保存一个总数的数组;您只需要记住当前的最大值并将其替换为每个更大的新总数。 .此外,您可能想尝试使用long 而不是int 来表示总数:如果他们给了您6514 个大于一百万的数字,您将溢出int 的容量,大约是总数的1/3一路走来……
  • @cricket_007 是的,我解决了,只是因为 Arrays.sort() 。我把它贴在下面。

标签: java arrays math


【解决方案1】:

谢谢我已经解决了,Arrays.sort() 花费了很多时间,所以我使用了另一种方法!

class Solution {
    public double findMaxAverage(int[] nums, int k) {
        double[] f = new double[nums.length];
        int length = nums.length;
        int sum = 0;
        double pre = 0;
        for (int i = 0; i < k; i++) {
            sum += nums[i];
        }
        if (length == k) {
            return ((double) sum /  k);
        }
        f[k - 1] = (double)sum; 
        pre = f[k-1]; // save the max  value
        for (int i = k - 1; i < length -1; i++) {
            f[i + 1] = f[i] - nums[i - k + 1] + nums[i + 1]; 
            if(f[i+1]>pre){
                pre = f[i+1]; // exchange the max value 
            }
        }
        // Arrays.sort(f);   // waste much time!
        return (double) pre / (double) k;
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 2011-03-29
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2017-12-16
    • 2018-07-07
    相关资源
    最近更新 更多