K Radius Subarray Averages

medium array sliding window

Problem

Given nums and k, build avgs where avgs[i] is the integer average of nums[i−k..i+k] when fully in bounds, otherwise −1.

Inputnums = [7,4,3,9,1,8,5,2,6], k = 3
Output[-1,-1,-1,5,4,4,-1,-1,-1]
avgs[3] = (7+4+3+9+1+8+5)/7 = 5.

def get_averages(nums, k):
    n = len(nums)
    avgs = [-1] * n
    w = 2 * k + 1
    if w > n:
        return avgs
    s = sum(nums[:w])
    avgs[k] = s // w
    for i in range(k + 1, n - k):
        s += nums[i + k] - nums[i - k - 1]
        avgs[i] = s // w
    return avgs
function getAverages(nums, k) {
  const n = nums.length;
  const avgs = new Array(n).fill(-1);
  const w = 2 * k + 1;
  if (w > n) return avgs;
  let s = 0;
  for (let i = 0; i < w; i++) s += nums[i];
  avgs[k] = Math.floor(s / w);
  for (let i = k + 1; i < n - k; i++) {
    s += nums[i + k] - nums[i - k - 1];
    avgs[i] = Math.floor(s / w);
  }
  return avgs;
}
class Solution {
    public int[] getAverages(int[] nums, int k) {
        int n = nums.length;
        int[] avgs = new int[n];
        Arrays.fill(avgs, -1);
        int w = 2 * k + 1;
        if (w > n) return avgs;
        long s = 0;
        for (int i = 0; i < w; i++) s += nums[i];
        avgs[k] = (int)(s / w);
        for (int i = k + 1; i < n - k; i++) {
            s += nums[i + k] - nums[i - k - 1];
            avgs[i] = (int)(s / w);
        }
        return avgs;
    }
}
vector<int> getAverages(vector<int>& nums, int k) {
    int n = nums.size();
    vector<int> avgs(n, -1);
    int w = 2 * k + 1;
    if (w > n) return avgs;
    long long s = 0;
    for (int i = 0; i < w; i++) s += nums[i];
    avgs[k] = (int)(s / w);
    for (int i = k + 1; i < n - k; i++) {
        s += nums[i + k] - nums[i - k - 1];
        avgs[i] = (int)(s / w);
    }
    return avgs;
}
Time: O(n) Space: O(n)