78851643e7b34054b81cffd79d6083df.png


题目链 接: https://leetcode.cn/problems/qIsx9U/


思路


方法一、队列模拟


直接想法

题目要求我们计算滑动窗口里所有数的平均值,给定了窗口大小size,我们在窗口里的数字个数不超过窗口大小时,按照个数计算平均值,一旦超过窗口大小,我们则需要移动窗口,计算当前窗口里的平均值


算法


1.设计 MovingAverage 结构体存放窗口大小size,当前窗口数总和sum,记录当前窗口的数 num数组


2.Constructor 函数用于把窗口大小size记录在 MovingAverage 结构体里


3. Next 方法用于计算窗口平均值

1)当前窗口数字个数不超过窗口大小,按照个数计算平均值

2)当前窗口数字个数超过窗口大小,需要移动窗口,计算当前窗口里的平均值


代码示例


type MovingAverage struct {
    size int
    sum int
    num []int
/** Initialize your data structure here. */
func Constructor(size int) MovingAverage {
    return MovingAverage{
        size: size,
func (m *MovingAverage) Next(val int) float64 {
    //超过窗口大小,需要移动窗口
    if len(m.num) == m.size{
        m.sum -= m.num[0]
        m.num = m.num[1:]
    m.sum += val
    m.num = append(m.num, val)
    return float64(m.sum) / float64(len(m.num))
 * Your MovingAverage object will be instantiated and called as such:
 * obj := Constructor(size);
 * param_1 := obj.Next(val);
 */

52d01ac99b8645019a69cc86e7459a51.png


复杂度分析


  • 时间复杂度:O(1) 初始化和调用Next方法都只需要O(1)的时间
  • 空间复杂度:O(size) 其中size是窗口大小,空间复杂度主要取决于窗口大小,窗口里的数字个数不会超过size
LeetCode剑指 Offer 58—左旋转字符串(三次翻转/double+substr)
LeetCode剑指 Offer 58—左旋转字符串(三次翻转/double+substr)