LeetCode346.数据流中的平均值

LeetCode346.数据流中的平均值

题目描述

给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。

示例:

MovingAverage m = new MovingAverage(3);

m.next(1) = 1

m.next(10) = (1 + 10) / 2

m.next(3) = (1 + 10 + 3) / 3

m.next(5) = (10 + 3 + 5) / 3

题解

用队列,超过窗长时,减去头指针的值,加上新入队的值,更新队列指针。

注意返回值为double。

typedef struct {

int *val;

int head;

int tail;

int size;

int len;

double sum;

} MovingAverage;

/** Initialize your data structure here. */

MovingAverage* movingAverageCreate(int size) {

MovingAverage *moving;

if (size == 0) {

return 0;

}

moving = (MovingAverage *)malloc(sizeof(MovingAverage));

moving->val = (int *)malloc(sizeof(int) * size);

moving->size = size;

moving->len = 0;

moving->head = 0;

moving->tail = -1;

moving->sum = 0;

return moving;

}

double movingAverageNext(MovingAverage* obj, int val) {

double sum = obj->sum;

if (obj->len < obj->size) {

sum += val;

obj->tail = (obj->tail + 1) % obj->size;

obj->val[obj->tail] = val;

obj->sum = sum;

obj->len++;

} else {

sum -= obj->val[obj->head];

sum += val;

obj->tail = (obj->tail + 1) % obj->size;

obj->val[obj->tail] = val;

obj->head = (obj->head + 1) % obj->size;

obj->sum = sum;

}

return sum/obj->len;

}

void movingAverageFree(MovingAverage* obj) {

free(obj->val);

free(obj);

}

更多尼泊尔内容

02年韩意战主裁回应假球说:问心无愧 意大利人编造谎言
反向代理是什麼?用途有哪些?
365提款验证

反向代理是什麼?用途有哪些?

🗓️ 07-14 👁️ 1728
菲拉格慕 瞬间时光 Ferragamo Attimo, 2010
mobile28365-365

菲拉格慕 瞬间时光 Ferragamo Attimo, 2010

🗓️ 08-02 👁️ 9859
郑州美博城
365提款验证

郑州美博城

🗓️ 10-26 👁️ 1882
为什么这台机器,是几代人的共同回忆?
365bet娱乐在线

为什么这台机器,是几代人的共同回忆?

🗓️ 10-02 👁️ 2387
水冷机箱要换水吗
365提款验证

水冷机箱要换水吗

🗓️ 09-08 👁️ 7633
Angel Beats
365提款验证

Angel Beats

🗓️ 09-12 👁️ 6513
【心得】關於[天工造物] 裝備改良系統的心得 @絕世好武功 哈啦板
育碧四年市值蒸发85%,《刺客信条》新作失利,公司前景堪忧:解散危机?