数据结构与算法之 leetcode 队列滑动窗口平均值 前缀和优化

数据结构与算法阿木 发布于 7 天前 2 次阅读


队列滑动窗口平均值(前缀和优化)在LeetCode中的应用

在数据结构与算法的学习过程中,滑动窗口问题是一个经典且具有挑战性的问题。它广泛应用于处理序列数据,如数组、链表等。在LeetCode中,滑动窗口问题也是一个高频考点。本文将围绕“队列滑动窗口平均值”这一主题,探讨如何使用前缀和优化算法,以高效地解决此类问题。

概述

滑动窗口平均值问题要求我们在一个数据序列中,计算一个固定长度窗口内的平均值。例如,给定一个数组`nums`和一个窗口大小`k`,我们需要计算从索引0开始的每个窗口的平均值。

常规解法

最直观的解法是遍历数组,对于每个窗口,计算窗口内所有元素的和,然后除以窗口的大小。这种方法的时间复杂度为O(nk),其中n是数组的长度,k是窗口的大小。

python

def sliding_window_average(nums, k):


n = len(nums)


result = []


for i in range(n - k + 1):


window_sum = sum(nums[i:i+k])


result.append(window_sum / k)


return result


前缀和优化

为了提高效率,我们可以使用前缀和优化算法。前缀和数组可以让我们在O(1)的时间复杂度内计算出任意子数组的和。这样,我们只需要在每次滑动窗口时,计算当前窗口的前缀和与前一个窗口的前缀和之差,即可得到当前窗口的和。

python

def sliding_window_average(nums, k):


n = len(nums)


prefix_sum = [0] (n + 1)


for i in range(1, n + 1):


prefix_sum[i] = prefix_sum[i - 1] + nums[i - 1]



result = []


for i in range(k, n + 1):


window_sum = prefix_sum[i] - prefix_sum[i - k]


result.append(window_sum / k)


return result


队列优化

在前缀和优化的基础上,我们可以进一步使用队列来优化算法。队列可以用来存储窗口内的元素,从而在O(1)的时间复杂度内移除窗口左边的元素,并添加窗口右边的元素。

python

from collections import deque

def sliding_window_average(nums, k):


n = len(nums)


result = []


queue = deque()



for i in range(n):


移除窗口左边的元素


if queue and queue[0] == i - k:


queue.popleft()



添加窗口右边的元素


queue.append(i)



当窗口大小达到k时,计算平均值


if i >= k - 1:


window_sum = prefix_sum[i + 1] - prefix_sum[i + 1 - k]


result.append(window_sum / k)



return result


LeetCode实例分析

在LeetCode中,有一个名为“滑动窗口平均值”的题目,要求我们计算一个固定长度窗口内的平均值。以下是该题目的描述和代码实现:

题目描述

给定一个整数数组`nums`和一个整数`k`,请计算从索引`0`开始的每个长度为`k`的滑动窗口的平均值。

示例:


输入:nums = [1,3,-1,-3,5,3,6,7], k = 3


输出:[1.0,2.0,2.5,3.0,3.5,4.5,5.0]


代码实现

python

from collections import deque

def sliding_window_average(nums, k):


n = len(nums)


result = []


queue = deque()



for i in range(n):


移除窗口左边的元素


if queue and queue[0] == i - k:


queue.popleft()



添加窗口右边的元素


queue.append(i)



当窗口大小达到k时,计算平均值


if i >= k - 1:


window_sum = nums[i + 1] - nums[i + 1 - k]


result.append(window_sum / k)



return result


总结

本文介绍了滑动窗口平均值问题,并探讨了如何使用前缀和优化和队列优化算法来提高算法的效率。通过LeetCode实例分析,我们了解了如何将算法应用于实际问题。在实际应用中,我们可以根据具体需求选择合适的优化方法,以达到最佳的性能。