其他系列文章导航
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
这道题目不难,但是确实是一道非常经典的滑动窗口问题,它可以帮助我们很好地理解滑动窗口算法的本质和应用。
滑动窗口算法是一种在数组或列表中寻找特定元素的强大工具,可以高效地解决一系列问题。
例如找到一个数组中最大的K个元素、在一个数组中查找子数组的数量等等。
滑动窗口算法的核心思想是在数组或列表中保持一个连续的、大小固定的窗口,并在遍历过程中动态地调整窗口的位置。
滑动窗口算法是一种常见的算法技巧,用于解决一些数组或字符串相关的问题。下面将详细介绍滑动窗口算法的工作原理和应用场景:
工作原理:
应用场景:
滑动窗口算法的步骤通常如下:
需要注意的是,滑动窗口算法的时间复杂度取决于窗口的大小和问题的特性。在某些情况下,可能需要通过调整窗口大小来优化算法的性能。
思路与算法:
滑动窗口顾名思义先要有窗口。
首先定义两个变量 sum 和 maxSum ,sum 存每次 k 个元素和, maxSum 存最大的 sum 。
那我们就在数组最前方取 k 个元素当作窗口,计算出 sum 。
然后更新 maxSum 。
窗口如何滑动? 去掉最前面的元素,加上后一个元素,实现滑动。
时刻更新 maxSum ,最后返回 (double) maxSum/k 。
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;
}
}
C++版本:
class Solution {
public:
double findMaxAverage(vector& 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(maxSum) / k;
}
};
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