【数据结构和算法】子数组最大平均数 I

简介: ​原题链接:力扣 643 题 子数组最大平均数 I给你一个由n个元素组成的整数数组nums和一个整数k。请你找出平均数最大且长度为k的连续子数组,并输出该最大平均数。任何误差小于10-5的答案都将被视为正确答案。​

其他系列文章导航

Java基础合集

数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 滑动窗口含义

2.2 滑动窗口一般解法

2.3 方法一:滑动窗口

三、代码

3.1 方法一:滑动窗口

四、复杂度分析

4.1 方法一:滑动窗口

 


前言

这是力扣的 643 题,难度简单,解题方案有很多种,本文讲解我认为最奇妙的一种。


一、题目描述

原题链接:力扣 643 题 子数组最大平均数 I

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k

请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。

任何误差小于 10-5 的答案都将被视为正确答案。

示例 1:

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

输出:12.75

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


示例 2:

输入:nums = [5], k = 1

输出:5.00000


提示:

    • n == nums.length
    • 1 <= k <= n <= 105
    • -104 <= nums[i] <= 104

    二、题解

    这道题目不难,但是确实是一道非常经典的滑动窗口问题,它可以帮助我们很好地理解滑动窗口算法的本质和应用。

    2.1 滑动窗口含义

    滑动窗口算法是一种在数组或列表中寻找特定元素的强大工具,可以高效地解决一系列问题。

    例如找到一个数组中最大的K个元素、在一个数组中查找子数组的数量等等。

    滑动窗口算法的核心思想是在数组或列表中保持一个连续的、大小固定的窗口,并在遍历过程中动态地调整窗口的位置。

    2.2 滑动窗口一般解法

    滑动窗口算法是一种常见的算法技巧,用于解决一些数组或字符串相关的问题。下面将详细介绍滑动窗口算法的工作原理和应用场景:

    工作原理:

      1. 窗口大小:滑动窗口算法通过设定一个窗口的大小来解决问题。窗口通常是一个连续的子数组或子字符串。
      2. 初始化窗口:初始化窗口的起始位置,并根据问题需求设定窗口的大小。
      3. 移动窗口:通过移动窗口的起始位置,不断调整窗口的大小和位置,以找到满足问题条件的解。
      4. 更新解:根据窗口的移动和调整,更新问题的解,并记录或返回所需的结果。

      应用场景:

        1. 最小/最大子数组/子字符串:寻找给定数组或字符串中满足特定条件的最小或最大的子数组或子字符串。
        2. 字符串匹配:在一个字符串中寻找另一个字符串的出现或满足特定条件的子串。
        3. 滑动窗口和哈希表结合:通过使用哈希表来优化滑动窗口算法,提高效率。
        4. 优化窗口大小:根据问题的特性,调整窗口大小以寻找最佳解。

        滑动窗口算法的步骤通常如下:

          1. 初始化窗口的起始位置和结束位置,使其满足问题的要求。
          2. 进入循环,不断移动窗口的起始位置和结束位置,直到窗口滑动到数组或字符串的末尾。
          3. 在每一次循环中,检查窗口内的元素是否满足问题的要求。如果满足条件,则更新解或执行其他操作。如果不满足条件,则继续移动窗口。
          4. 在移动窗口时,要更新窗口内的元素和相应的数据结构,以确保窗口的正确性。
          5. 重复步骤2到步骤4,直到遍历完整个数组或字符串,返回解或所需的结果。

          需要注意的是,滑动窗口算法的时间复杂度取决于窗口的大小和问题的特性。在某些情况下,可能需要通过调整窗口大小来优化算法的性能。

          2.3 方法一:滑动窗口

          思路与算法:

          image.gif编辑

          滑动窗口顾名思义先要有窗口。

          首先定义两个变量 sum 和 maxSum ,sum 存每次 k 个元素和, maxSum 存最大的 sum 。

          那我们就在数组最前方取 k 个元素当作窗口,计算出 sum 。

          image.gif编辑

          然后更新 maxSum 。

          窗口如何滑动? 去掉最前面的元素,加上后一个元素,实现滑动。

          image.gif编辑

          时刻更新 maxSum ,最后返回 (double) maxSum/k 。


          三、代码

          3.1 方法一:滑动窗口

          Java版本:

          class Solution {
              public double findMaxAverage(int[] nums, int k) {
                 int sum = 0, maxSum;
                  for (int i = 0; i < k; i++) {
                      sum += nums[i];
                  }
                  maxSum = sum;
                  for (int i = k; i < nums.length; i++) {
                      sum = sum - nums[i - k] + nums[i];
                      maxSum=Math.max(maxSum,sum);
                  }
                  return (double) maxSum/k;
              }
          }

          image.gif

          C++版本:

          class Solution {
          public:
              double findMaxAverage(vector<int>& nums, int k) {
                  int sum = 0, maxSum;
                  for (int i = 0; i < k; i++) {
                      sum += nums[i];
                  }
                  maxSum = sum;
                  for (int i = k; i < nums.size(); i++) {
                      sum = sum - nums[i - k] + nums[i];
                      maxSum = max(maxSum, sum);
                  }
                  return static_cast<double>(maxSum) / k;
              }
          };

          image.gif

          Python版本:

          class Solution:
              def findMaxAverage(self, nums: List[int], k: int) -> float:
                  _sum = sum(nums[:k])
                  max_sum = _sum
                  for i in range(k, len(nums)):
                      _sum = _sum - nums[i - k] + nums[i]
                      max_sum = max(max_sum, _sum)
                  return max_sum / k

          image.gif


          四、复杂度分析

          4.1 方法一:滑动窗口

            • 时间复杂度:O(n),其中 n 是数组 nums 的长度。遍历数组一次。
            • 空间复杂度:O(1)。
            目录
            相关文章
            |
            23天前
            |
            算法 数据处理 C语言
            C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
            本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
            34 1
            |
            26天前
            |
            机器学习/深度学习 算法 数据挖掘
            K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
            K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
            84 4
            |
            2月前
            |
            存储 人工智能 算法
            数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
            这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
            92 3
            数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
            |
            24天前
            |
            存储 算法 搜索推荐
            Python 中数据结构和算法的关系
            数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
            |
            24天前
            |
            数据采集 存储 算法
            Python 中的数据结构和算法优化策略
            Python中的数据结构和算法如何进行优化?
            |
            1月前
            |
            算法
            数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
            在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
            97 23
            |
            1月前
            |
            算法
            数据结构之蜜蜂算法
            蜜蜂算法是一种受蜜蜂觅食行为启发的优化算法,通过模拟蜜蜂的群体智能来解决优化问题。本文介绍了蜜蜂算法的基本原理、数据结构设计、核心代码实现及算法优缺点。算法通过迭代更新蜜蜂位置,逐步优化适应度,最终找到问题的最优解。代码实现了单链表结构,用于管理蜜蜂节点,并通过适应度计算、节点移动等操作实现算法的核心功能。蜜蜂算法具有全局寻优能力强、参数设置简单等优点,但也存在对初始化参数敏感、计算复杂度高等缺点。
            60 20
            |
            23天前
            |
            并行计算 算法 测试技术
            C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
            C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
            54 1
            |
            1月前
            |
            机器学习/深度学习 算法 C++
            数据结构之鲸鱼算法
            鲸鱼算法(Whale Optimization Algorithm,WOA)是由伊朗研究员Seyedali Mirjalili于2016年提出的一种基于群体智能的全局优化算法,灵感源自鲸鱼捕食时的群体协作行为。该算法通过模拟鲸鱼的围捕猎物和喷出气泡网的行为,结合全局搜索和局部搜索策略,有效解决了复杂问题的优化需求。其应用广泛,涵盖函数优化、机器学习、图像处理等领域。鲸鱼算法以其简单直观的特点,成为初学者友好型的优化工具,但同时也存在参数敏感、可能陷入局部最优等问题。提供的C++代码示例展示了算法的基本实现和运行过程。
            50 0
            |
            1月前
            |
            算法 vr&ar 计算机视觉
            数据结构之洪水填充算法(DFS)
            洪水填充算法是一种基于深度优先搜索(DFS)的图像处理技术,主要用于区域填充和图像分割。通过递归或栈的方式探索图像中的连通区域并进行颜色替换。本文介绍了算法的基本原理、数据结构设计(如链表和栈)、核心代码实现及应用实例,展示了算法在图像编辑等领域的高效性和灵活性。同时,文中也讨论了算法的优缺点,如实现简单但可能存在堆栈溢出的风险等。
            42 0