2090. 半径为 k 的子数组平均值
题目链接:https://leetcode.cn/problems/k-radius-subarray-averages/
代码
ts
/**
* 2090. 半径为 k 的子数组平均值
* https://leetcode.cn/problems/k-radius-subarray-averages/
*/
function getAverages(nums: number[], k: number): number[] {
// 窗口大小左右各k个+自身
const w = 2 * k + 1;
const len = nums.length;
const res = new Array(len).fill(-1);
let sum = 0;
for (let i = 0; i < len; i++) {
sum += nums[i];
// 如窗口大小超过 w,则移除最左侧的元素
if (i - w >= 0) {
sum -= nums[i - w];
}
// 当窗口大小刚好达到 w 时,开始计算平均值
if (i - w + 1 >= 0) {
// 窗口中心位置是 i - k
res[i - k] = Math.floor(sum / w)
}
}
return res;
}思路
使用滑动窗口:
窗口大小为
2 * k + 1(左右各k个元素加上中心元素)维护窗口的和
sum,当窗口大小达到w时,计算平均值并填入结果数组的中心位置i - k对于无法形成完整窗口的位置(数组两端),结果设为
-1时间复杂度
,只需遍历一次数组空间复杂度
,需要存储结果数组