// 5939. 半径为 k 的子数组平均值
class Solution {
public int[] getAverages(int[] nums, int k) {
// 存储答案
int[] ans = new int[nums.length];
// 除中心元素外其它元素的个数,也就是[i-k, i+k]内元素个数减一
final int finalPos = k << 1;
// 当前保存窗口中数字和
long sum = 0;
int i = 0;
for(; i < nums.length; i++){
if(i >= finalPos){
// 将该位置先置为-1, 这里是为了处理数组左边结果值为-1的位置
ans[i] = -1;
// 开始计算i - k 处对应的平均值
// 加上i - k对应的右边界值
sum += nums[i];
// 计算结果
ans[i - k] = (int)(sum / (finalPos + 1));
// 减去i - k对应的左边界
sum -= nums[i - finalPos];
}else{
// 所有在[0, finalPos - 1]内的元素结果都即为 -1
ans[i] = -1;
// 累加
sum += nums[i];
}
}
// 如果不写上面的 if(i >= finalPos){ ans[i] = -1;}, 就需要下面的处理
// 直接返回当数组个数小于
// if(0 > (i -= k)){
// return ans;
// }
// 处理数组最右边元素的结果
// while(i < nums.length){
// ans[i++] = -1;
// }
return ans;
}
}
08-31
248
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)