【问题标题】:Maximum average Subarray最大平均子数组
【发布时间】:2019-01-05 16:59:17
【问题描述】:

我正在处理 Leetcode 问题,但无法清除所有测试用例。 它说其中一种解决方案已超过时间限制

给定一个由 n 个整数组成的数组,找到给定长度 k 且平均值最大的连续子数组。并且你需要输出最大的平均值。

示例 1: 输入:[1,12,-5,-6,50,3],k = 4 输出:12.75 解释:最大平均值为 (12-5-6+50)/4 = 51/4 = 12.75

我对这个问题的解决方案:

class Solution {
    public double findMaxAverage(int[] nums, int k) {
        double average = -Double.MAX_VALUE;
        double temp = -Double.MAX_VALUE;
        for(int i=0;i<nums.length;i++)
        {
            int sum = 0;
            int count = 0;
            for(int j=i;j<nums.length;j++)
            {
                count ++;
                sum += nums[j];
                if(count ==k)
                {
                    temp = (double)(sum)/k;
                    average = Math.max(temp,average);

                }
            }
        }


        return average;
    }
}

我能够清除 69/123 个测试用例。但在其他表示已超过时间限制的情况下失败。

请帮助修复我的代码。

【问题讨论】:

  • 您需要将时间复杂度从 O(n^2) 提高。换句话说,想办法避免使用嵌套循环。

标签: arrays


【解决方案1】:

您可以加速您的代码。

例如:

class Solution {
    public double findMaxAverage(int[] nums, int k) {
        double average = -Double.MAX_VALUE;
        double temp = -Double.MAX_VALUE;
        int imax = nums.length-k;
        int sum = 0;
        for (int i = 0; i < imax; i++)
        {
            if (i == 0)
            {
                for (int j = 0; j < k; j++)
                {
                    sum += nums[j];
                }
            }
            else
            {
                sum += nums[i - 1 + k] - nums[i - 1];
            }
            average = Math.max((double)(sum)/k,average);
        }
        return average;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多