题目描述
给定一个窗口大小和一个整数数据流,根据该滑动窗口的大小,计算滑动窗口里所有数字的平均值。
实现 MovingAverage
类:
MovingAverage(int size)
用窗口大小size
初始化对象。double next(int val)
成员函数next
每次调用的时候都会往滑动窗口增加一个整数,请计算并返回数据流中最后size
个值的移动平均值,即滑动窗口里所有数字的平均值。
示例:
输入: inputs = ["MovingAverage", "next", "next", "next", "next"] inputs = [[3], [1], [10], [3], [5]] 输出: [null, 1.0, 5.5, 4.66667, 6.0] 解释: MovingAverage movingAverage = new MovingAverage(3); movingAverage.next(1); // 返回 1.0 = 1 / 1 movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2 movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3 movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
提示:
1 <= size <= 1000
-105 <= val <= 105
- 最多调用
next
方法104
次
思路
代码
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();
for (int i = 0; i < n - 1; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target) {
return { i, j };
}
}
}
return {};
}
};
int main() {
string input;
getline(cin, input);//[3,1,10,3,5]
input = input.substr(1, input.length() - 2);
istringstream iss(input);
vector<int> nums;
string numStr;
while (getline(iss, numStr, ',')) {
nums.push_back(stoi(numStr));
}
int target;
cin >> target;
Solution a;
vector<int> ans = a.twoSum(nums, target);
for (auto x : ans) {
cout << x << " ";
}
}
复杂度分析
时间复杂度:初始化和每次调用 next 的时间复杂度都是 O(1)。
空间复杂度:O(size),其中 size 是滑动窗口的大小。空间复杂度主要取决于队列,队列中的数字个数不超过 size。