zoukankan      html  css  js  c++  java
  • Leetcode 643.子数组最大平均数I

    子数组最大平均数I

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

    示例 1:

    输入: [1,12,-5,-6,50,3], k = 4

    输出: 12.75

    解释: 最大平均数 (12-5-6+50)/4 = 51/4 = 12.75

       

    注意:

    1. 1 <= k <= n <= 30,000。
    2. 所给数据范围 [-10,000,10,000]。

    思路

    本题拿到手的时候,第一个思路就是对每一个元素都去求其长度为k的连续子数组的平均数,最后比较返回最大平均数,这样的算法时间复杂度~n*k,当k接近n时,时间复杂度~n平方,所以放弃这种算法。

    我们初始化一个sum变量保存元素之和(初始化为0),一个maxAvg保存最大的平均数(初始化为Double下的负数最小值),这里需要强调一下, Double.NEGATIVE_INFINITY 表示负无穷,Double.MIN_VALUE 表示的是64位双精度值能表示的最小正数。然后开始遍历数组元素,每一步首先都将sum更新,然后判断当前索引是否大于等于k - 1,当等于k - 1时,对当前sum求平均,与maxAvg比较,当大于k - 1时,需要减去nums[i - k],这样就实现了动态更新sum,当小于k - 1时,继续循环。最后返回maxAvg即可。

     1 public class Solution {
     2     public double findMaxAverage(int[] nums, int k) {
     3         /**
     4          * Double.NEGATIVE_INFINITY 表示负无穷
     5          * Double.MIN_VALUE 表示的是64位双精度值能表示的最小正数
     6          */
     7         double maxAvg = Double.NEGATIVE_INFINITY;
     8         double sum = 0.0;
     9         for (int i = 0; i < nums.length; i++) {
    10             sum += nums[i];
    11             if (i >= k - 1) {
    12                 if (i > k - 1) {
    13                     sum = sum - nums[i - k];
    14                 }
    15                 if (sum / k > maxAvg) maxAvg = sum / k;
    16             }
    17         }
    18         return maxAvg;
    19     }
    20 }
  • 相关阅读:
    django操作mysql时django.db.utils.OperationalError: (2003, "Can't connect to MySQL server")异常的解决方法
    Django实践:个人博客系统(第七章 Model的设计和使用)
    shared_ptr / weak_ptr 代码片段
    Java中比较容易混淆的知识点
    指针和引用作为参数的区别
    STL 算法
    STL扩展容器
    STL中 map 和 multimap
    STL中 set 和 multiset
    <<C++标准程序库>>中的STL简单学习笔记
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10383057.html
Copyright © 2011-2022 走看看